2011-08-09 5 views
2

J'apprends postgresql et je n'arrive pas à comprendre comment écrire cette requête imbriquée ou si c'est même possible.Postgresql imbriqué SELECT

Table -> Points: pid | val 

Table -> Grid: gid | max_val | min_val 

Return I want: pid | gid | val 

Voilà comment je le vois dans ma tête

for p in (SELECT * FROM Points) 
    SELECT gid FROM Grid AS g WHERE p.val < g.max_val AND p.val > g.min_val 

Est-ce possible? Si oui, quelqu'un peut-il me diriger dans la bonne direction?

Répondre

2

Je ne pense pas que vous ayez besoin d'une requête imbriquée, juste une jointure. Est-ce que quelque chose comme ça donne ce dont vous avez besoin?

SELECT 
    P.pid, 
    G.gid, 
    P.val 
FROM 
    Grid   AS G 
INNER JOIN 
    Points  AS P 
    ON P.val < g.max_val 
    AND P.Val > g.min_val 
1

Après requête retournera toujours le point même si val point n'est pas dans une plage de grille - dans gid tel cas sera NULL:

SELECT 
    p.pid, 
    g.gid, 
    p.val 
FROM 
    Points p 
    LEFT JOIN Grid g ON g.min_val > p.val AND g.max_val < p.val 

S'il y a plus d'une grille avec une plage correspondra à la valeur du point, la requête retournera deux lignes pour chaque gid.

Si vous voulez retourner uniquement les points correspondant à une grille, il suffit d'ajouter une condition:

WHERE 
    g.gid IS NOT NULL 
Questions connexes