2010-11-05 4 views
1
1. links: link_id, road 
2. roads: road, code 
2. admin_classes: code, admin_class, priority 

Donc, pour une LINK_ID j'ai plusieurs codes et plusieurs RAWs admin_class + priorité Mais le jeu de résultats i besoin que d'une ligne pour chaque link_id: link_id et admin_class, que fait référence à la priorité min. J'essaie de faire une déclaration sql, comme suit:SQL: comment ajouter la condition sur une sélection intérieure

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
on ac.code=l.code 
where ac.admin_class<>0 

mais, d'une part, il ne fonctionne pas et il n'est pas que j'ai besoin. Je veux seulement deux colonnes en jeu de résultats - link_id et admin_class

Ensuite, j'essaie suivants:

select l.link_id, (select ac.admin_class from base.admin_classes as ac where ac.code=l.code 
order by ac.priority limit 1) as admin_class from base.links as l 

Il est juste, mais je ne sais comment ajouter la condition sur certains intérieur, je ne ai besoin RAWs avec admin_class <> 0

J'utilise PostgreSql 8.3

Merci à l'avance.

Répondre

0

Cela ne fonctionne pas?

inner join base.admin_classes as ac 
on ac.code=l.code and ac.admin_class<>0 
1

Je ne suis pas familier avec postgresql, mais je devine que la requête initiale ne fonctionne pas becuse vous avez une fonction d'agrégation min() sans group by

Néanmoins, les éléments suivants doivent travailler si vous ne « t besoin de la min():

select l.link_id, ac.admin_class 
from base.links as l 
inner join base.admin_classes as ac 
     on ac.code=l.code 
     and ac.admin_class<>0 

Sinon, essayez:

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
     on ac.code=l.code 
     and ac.admin_class<>0 
group by l.link_id, ac.admin_class 
+0

Désolé, j'ai essayé de simplifier et j'ai écrit incorrect)) nous avons le tableau 1 suivant: link_id, code. table2: id, code, route. table3: route, admin_class, priorité. Donc nous avons plusieurs routes pour un link_id et plusieurs lignes de table 3 pour un link_id, mais nous voulons obtenir link_id + admin_class avec priorité min) – user498274

+0

Merci pour la réponse) Mais je n'ai besoin que de deux colonnes dans le jeu de résultats car je l'utilise dans imsert clouse ((Et la dernière déclaration retournera les matières suivantes 1-2-2, 1-3-2, 1-4-2 pour un link_id = 1, mais je n'ai besoin que d'une ligne pour un link_id – user498274

0

Eh bien, je ne sais pas beaucoup sur PostgreSql, mais comment cela se fait avec T-SQL:

select l.link_id, ac.admin_class, min(ac.priority) 
from base.links as l 
inner join base.admin_classes as ac 
on ac.code=l.code 
group by l.link_id, ac.admin_class 
having ac.admin_class <> 0 
+0

Je crois que le 'avoir' La clause n'est vraiment nécessaire que lorsque vous l'utilisez conjointement avec l'agrégat lui-même.Changer le 'où' et déplacer la ligne au-dessus du 'groupe par' fonctionnera aussi :-) –

+0

Je me suis trompé (j'ai plusieurs raws de admin_classes pour un link_id donc votre requête renvoie smth comme ceci: 1-2-2, 1 -3-2 et ect.Mais je n'ai besoin que d'une ligne pour un identifiant de lien et seulement deux colonnes parce que je l'utilise dans la clause d'insertion – user498274

1

Je crois que vous devriez faire deux choses.

1er Créez la vue viewAdminRoads


CREATE VIEW viewAdminRoads 
AS 
SELECT 
roads.code, 
roads.road, 
admin_classes.admin_class, 
admin_classes.priority 
FROM roads 
INNER JOIN admin_classes 
     ON roads.road 
     = admin_classes.road 
WHERE admin_classes.priority <> 0 

Créer ce point de vue simplifie l'ensemble du processus

2 Créer votre sélection


SELECT 
link.link_id, 
MIN(viewAdminRoads.priority) as priority 
FROM links 
INNER JOIN viewAdminRoads 
     ON links.code 
     = viewAdminRoads.code 
GROUP BY link.link_id 

Rappelez-vous, les vues sont vos frien ré.

+0

Je suis d'accord, mais notre politique de projet n'accepte pas les vues. sélectionnez Merci de votre réponse – user498274

Questions connexes