2012-05-08 12 views
35

Desidero unire due tabelle CUSTMR e DEPRMNT.Come scrivere sottoquery nell'istruzione OUTER JOIN

Il mio bisogno è: LEFT OUTER JOIN di due o più tabelle con sottoquery all'interno della SINISTRA Join esterno come illustrato di seguito:

Tabella: CUSTMR, DEPRMNT

Query come:

SELECT 
    cs.CUSID 
    ,dp.DEPID 
FROM 
    CUSTMR cs 
     LEFT OUTER JOIN (
      SELECT 
        dp.DEPID 
        ,dp.DEPNAME 
       FROM 
        DEPRMNT dp 
       WHERE 
        dp.DEPADDRESS = 'TOKYO' 
     ) 
      ON (
       dp.DEPID = cs.CUSID 
       AND cs.CUSTNAME = dp.DEPNAME 
      ) 
WHERE 
    cs.CUSID != '' 

Qui la sottoquery è:

SELECT 
    dp.DEPID, dp.DEPNAME 
FROM 
    DEPRMNT dp 
WHERE 
    dp.DEPADDRESS = 'TOKYO' 

È possibile scrivere tali sottoquery ins ide LASCIARE DALL'ESTERO?

Viene visualizzato un errore durante l'esecuzione di questa query sul mio database DB2.

+4

Si deve sempre inserire l'errormessage si riceve. –

+0

Perché il titolo dice INNER JOIN e la domanda dice OUTER JOIN ?? ... Sto modificando questo –

risposta

63

È necessario "id di correlazione" ("AS SS") nella sottoselezione per fare riferimento ai campi nella condizione "ON". Gli ID assegnati all'interno della selezione secondaria non sono utilizzabili nel join.

SELECT 
     cs.CUSID 
     ,dp.DEPID 
FROM 
    CUSTMR cs 
     LEFT OUTER JOIN (
      SELECT 
        DEPID 
        ,DEPNAME 
       FROM 
        DEPRMNT 
       WHERE 
        dp.DEPADDRESS = 'TOKYO' 
     ) ss 
      ON (
       ss.DEPID = cs.CUSID 
       AND ss.DEPNAME = cs.CUSTNAME 
      ) 
WHERE 
    cs.CUSID != '' 
+1

Sì! "James Anderson", grazie mille. Il mio problema è stato risolto. Ho trovato che il mio problema era dovuto al nome dell'alias. ** La query Sub interna deve sempre avere un nome alias! ** – YROjha

+0

Questa è una sottoquery correlata, e quindi finisce per essere una prestazione scadente? – Abdul

+0

"Le prestazioni" dipendono interamente dagli indici disponibili, dalla memoria disponibile, dall'allocazione fisica del dsik, dalla cardinalità, da quanti soldi hai pagato per il software, ecc. Ecc. Avere l'SQL sintatticamente corretto è solo un punto di partenza. –

0

penso che non c'è bisogno di utilizzare sub query in questo scenario.You può direttamente esterno sinistro partecipare al tavolo DEPRMNT.

Durante l'utilizzo di sinistra outer join, non utilizzare le colonne nella tabella RHS del join nella condizione in cui, si otterrà l'uscita sbagliata

+1

. In realtà nella mia logica aziendale, la sotto-query ha un gruppo usato, in quel momento abbiamo richiesto di scrivere una sotto-query! – YROjha