2012-05-08 51 views
35

我想加入兩個表CUSTMR和DEPRMNT。如何在OUTER JOIN語句內寫入子查詢語句

我需要的是:LEFT OUTER與左外內部子查詢的兩個或更多表的JOIN下面JOIN如圖所示:

表:CUSTMR,DEPRMNT

查詢爲:

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 != '' 

這裏的子查詢是:

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

是否有可能編寫這樣的子查詢ide左外連接?

在DB2數據庫上運行此查詢時出現錯誤。

+4

你應該總是後您將收到的ErrorMessage。 –

+0

爲什麼標題說INNER JOIN和問題說OUTER JOIN ??我在編輯這個 –

回答

63

您需要子選擇上的「相關ID」(「AS SS」thingy)來引用「ON」條件中的字段。在子選擇內部分配的ID在連接中不可用。

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

是的! 「詹姆斯安德森」,非常感謝你。我的問題解決了。我發現我的問題是由於別名。 **內部子查詢應該總是有一個別名!** – YROjha

+0

這是一個相關的子查詢,因此最終表現不佳? – Abdul

+0

「性能」完全取決於可用索引,可用內存,物理dsik分配,基數,您爲軟件支付了多少錢等等。具有語法正確的SQL只是一個起點。 –

0

我覺得你不必在這種情況下使用子查詢。你可以直接在外面加入DEPRMNT表。

在使用左外連接,在連接中的RHS表中的WHERE條件不使用的列,你會得到錯誤的輸出

+1

。實際上在我的業務邏輯中,子查詢有分組使用,當時我們需要編寫子查詢! – YROjha