2009-09-13 14 views
5

J'ai un opertaion d'union entre deux tablesSQL: cascade UNION et JOIN

SELECT ID_1, 
     name_1, 
     surname_1, 
    FROM T_ONE 
UNION 
SELECT ID_2, 
     name_2, 
     surname_2 
    FROM TABLE_2 

Je veux rejoindre le résultat de cette opération UNION avec une autre table ou même avec tous TABLE_1.

Comment puis-je gérer ce nouveau résultat de table du UNION.

par exemple après la précédente UNION:

RIGHT JOIN TABLE_3 
     ON TABLE_3.ID_3 = XXXXXXXXXXXXXXXXXXXX.ID_2 

Je ne sais vraiment pas ce que je dois mettre à la place du XXXXXXXXXXXXXXXX andle la nouvelle table générée par l'UNION.

Répondre

12

Utilisez une table dérivée comme "foo" ici, puis rejoignons comme vous le souhaitez:

SELECT 
    * 
FROM 
    TABLE_3 
    LEFT JOIN 
    (
    SELECT ID_1, name_1, surname_1, FROM T_ONE 
    UNION --ALL would be more efficient if results do not overlap, as van's comment said 
    SELECT ID_2, name_2, surname_2 FROM TABLE_2 
    ) foo ON TABLE_3.ID_3 = foo.ID_1 

PS. Utilisez les jointures LEFT: moins déroutantes, puis les jointures RIGHT.

+2

et j'utiliser UNION ALL au lieu de simplement UNION afin d'éviter le tri des résultats, puisque vous savez ils sont différents (les données des tables T_ONE et TABLE_2 ne se chevauchent pas, n'est-ce pas?) – van

+0

@Van: Nous ne pouvons pas supposer cela, mais c'est un bon point. Édité. – gbn

+0

Im face à un problème similaire, sauf les syndicats sont sur le dessus, et je ne peux pas utiliser la droite rejoindre parce que ce n'est pas actuellement pris en charge sur la plate-forme. Est-il possible de le restructurer pour utiliser une jointure gauche avec les syndicats sur le premier choix? –

1

Vous devez fournir une jointure dans les deux SELECT:

SELECT ID_1, name_1, surname_1, FROM T_ONE 
RIGHT JOIN TABLE_3 ON TABLE_3.ID_3 = T_ONE.ID_1 

UNION 

SELECT ID_2, name_2, surname_2 FROM TABLE_2 
RIGHT JOIN TABLE_3 ON TABLE_3.ID_3 = TABLE_2.ID_2 

Ou quelque chose comme ça. Ne pas oublier qu'une UNION élimine les doublons, donc si vous voulez des doublons à inclure, uyse UNION ALL

2
SELECT ID_1, name_1, surname_1, FROM T_ONE 

from 
(SELECT ID_1, name_1, surname_1, FROM T_ONE 
UNION 
SELECT ID_2, name_2, surname_2 FROM TABLE_2) foo 

left join TABLE_3 

ON TABLE_3.ID_3 =foo.ID_2