2009-09-13 19 views
5

ho un opertaion unione tra due tabelleSQL: cascata UNION e JOIN

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

voglio unire il risultato di questa operazione UNION con un altro tavolo o anche con tutti i TABLE_1.

Come posso gestire questo nuovo risultato di tabella di UNION.

ad esempio dopo il precedente UNION:

RIGHT JOIN TABLE_3 
     ON TABLE_3.ID_3 = XXXXXXXXXXXXXXXXXXXX.ID_2 

Io davvero non so cosa ho bisogno di mettere al posto del XXXXXXXXXXXXXXXX per andle la nuova tabella generata dalla UNION.

risposta

12

Utilizzare una tabella derivata come "pippo" qui, e poi unirsi di nuovo tuttavia si desidera:

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. Usa i join SINISTRA: meno confusi quindi i join GIUSTI.

+2

e vorrei utilizzare UNION ALL anziché solo dell'Unione, al fine di evitare l'ordinamento dei risultati, poiché si sa sono diversi (i dati delle tabelle T_ONE e TABLE_2 non si sovrappongono, vero?) – van

+0

@Van: non lo possiamo supporre, ma è un buon punto. Modificato. – gbn

+0

Sto affrontando un problema simile, eccetto che i sindacati sono in cima, e non posso usare il diritto join perché non è attualmente supportato sulla piattaforma. È possibile ristrutturarlo per utilizzare un join di sinistra con i sindacati alla prima selezione? –

1

è necessario fornire un join in entrambi 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 

O qualcosa del genere. Non dimenticate che un UNION elimina i duplicati, quindi se volete i duplicati da inserire, 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