2009-09-13 12 views
5

Mam opertaion związek między dwiema tabelamiSQL: kaskada UNION i dołącz

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

Chcę dołączyć wynik tej operacji UNION z innej tabeli lub nawet ze wszystkimi TABLE_1.

Jak obsłużyć ten nowy wynik tabeli z UNION.

na przykład po poprzednim UNION:

RIGHT JOIN TABLE_3 
     ON TABLE_3.ID_3 = XXXXXXXXXXXXXXXXXXXX.ID_2 

ja naprawdę nie wiem, co muszę umieścić zamiast xxxxxxxxxxxxxxxx do andle nową tabelę generowany przez UNION.

Odpowiedz

12

Użyj tabelę pochodzącą jak "foo" tutaj, a następnie dołączyć ponownie jednak chcesz:

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. Użyj sprzężeń LEFT: mniej mylące, a następnie RIGHT dołącza.

+2

i chciałbym używać UNION ALL zamiast UNION tylko w celu uniknięcia sortowania wyników, ponieważ wiesz są różne (dane z tabel T_ONE i TABLE_2 nie pokrywają się, czyż nie?) – van

+0

@Van: Nie możemy tego założyć, ale jest to dobry punkt. Edytowane. – gbn

+0

Mam do czynienia z podobnym problemem, z tym, że związki są na górze i nie mogę użyć prawego sprzężenia, ponieważ nie jest on obecnie obsługiwany na platformie. Czy możliwe jest zrestrukturyzowanie go w celu użycia lewostronnego ze związkami na pierwszym wyborze? –

1

Trzeba zapewnić przyłączyć zarówno 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 

czy coś takiego. Nie zapominaj, że unia eliminuje duplikaty, więc jeśli chcesz duplikaty, które należy uwzględnić, 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