2012-02-06 65 views
1

兩個子選擇都能正常運行。帶有兩個子選擇的FULL OUTER JOIN給出了「ORA-00918:明確定義的列」

但我想加入他們,總是給「ORA-00918:列不明確定義」。我不明白爲什麼?

這兩個子選擇都使用其他名稱。

SELECT * 
    FROM (SELECT aods.user_id, 
        aods.firstname, 
        aods.lastname, 
        Aods.DEPARTMENT, 
        cods.jc_name 
      FROM personas aods 
        LEFT JOIN 
        user_jc cods 
        ON aods.user_id = cods.user_id 
      WHERE cods.jc_name LIKE '%ADM%') ods 
     FULL OUTER JOIN 
      (SELECT abl.user_id, 
        abl.firstname, 
        abl.lastname, 
        Abl.DEPARTMENT, 
        bbl.ug_name 
      FROM personas abl 
        LEFT JOIN 
        ru_ug bbl 
        ON abl.user_id = bbl.user_id 
      WHERE Bbl.UG_NAME LIKE '%ADM%' 
        AND bbl.rss_name = 'TIR') bl 
     ON ods.user_id = bl.user_id 

回答

6

因爲您在頂部做了select *

user_id 
firstname 
lastname 
DEPARTMENT 

同時存在於子查詢,並與select *它會得到兩列具有相同的名稱。

如果要合併的兩個子查詢(使得所產生的列集將user_id, firstname, lastname, DEPARTMENT, jc_name, ug_name),你應該做一個natural join

SELECT * 
    FROM (SELECT aods.user_id, aods.firstname, aods.lastname, aods.department, 
       cods.jc_name 
      FROM personas aods LEFT JOIN user_jc cods 
       ON aods.user_id = cods.user_id 
     WHERE cods.jc_name LIKE '%ADM%') ods 
     NATURAL JOIN 
     (SELECT abl.user_id, abl.firstname, abl.lastname, abl.department, 
       bbl.ug_name 
      FROM personas abl LEFT JOIN ru_ug bbl ON abl.user_id = bbl.user_id 
     WHERE bbl.ug_name LIKE '%ADM%' AND bbl.rss_name = 'TIR') bl 

相反,如果你希望所有的不同列時,應明確列出其中:

SELECT ods.user_id, ods.firstname, ods.lastname, ods.department, ods.jc_name, 
     bl.user_id, bl.firstname, bl.lastname, bl.department, bl.ug_name 
    FROM (SELECT aods.user_id, aods.firstname, aods.lastname, aods.department, 
       cods.jc_name 
      FROM personas aods LEFT JOIN user_jc cods 
       ON aods.user_id = cods.user_id 
      WHERE cods.jc_name LIKE '%ADM%') ods 
     FULL OUTER JOIN 
     (SELECT abl.user_id, abl.firstname, abl.lastname, abl.department, 
       bbl.ug_name 
      FROM personas abl LEFT JOIN ru_ug bbl ON abl.user_id = bbl.user_id 
      WHERE bbl.ug_name LIKE '%ADM%' AND bbl.rss_name = 'TIR') bl 
     ON ods.user_id = bl.user_id 

在您的評論你說,你要對每列使用nvl()與外連接。對我來說,它工作正常:

SELECT NVL (ods.user_id, bl.user_id), NVL (ods.firstname, bl.firstname), 
     NVL (ods.lastname, bl.lastname), NVL (ods.department, bl.department), 
     ods.jc_name, bl.ug_name 
    FROM (SELECT '1' user_id, 'ods2' firstname, NULL lastname, 
       'ods3' department, 'ods4' jc_name 
      FROM DUAL) ods 
     FULL OUTER JOIN 
     (SELECT '1' user_id, NULL firstname, 'bl2' lastname, 'bl3' department, 
       'bl4' ug_name 
      FROM DUAL) bl ON ods.user_id = bl.user_id 

你做一些額外的東西,像order by

+0

謝謝ramsesoriginal您的幫助。自然連接正常工作,但這不是我想要的。我在這裏格式化了一些問題。 全外部聯接給了我一次 「ORA-00918:含糊不清的列」 ' 選擇 \t NVL(ods.user_id,bl.user_id), NVL(ods.firstname,bl.firstname), NVL( ods.lastname,bl.lastname), NVL(ods.department,bl.department), ods.jc_name, bl.ug_name' – 2012-02-06 11:33:14

+0

我編輯了答案 – ramsesoriginal 2012-02-06 11:47:37

+1

我不能拿出更好的解釋,但是這個一個人不適合我。我從來沒有遇到過使用SELECT *處理重複列名的問題 - 它應該會自動替代其中的一個。也許它取決於正在使用的客戶端以及它如何處理查詢結果。作爲一個例子,'SELECT * FROM (從級別<= 10的雙重連接中選擇級別l)完全外部連接(從級別<= 15的雙重連接中選擇級別l)b在bl =我在SQL Developer和SQLPlus中。 – 2012-02-06 13:40:20

0

指定列名:

SELECT ods.*, bl.* 
    FROM (SELECT aods.user_id, 
        aods.firstname, 
        aods.lastname, 
        Aods.DEPARTMENT, 
        cods.jc_name 
      FROM personas aods 
        LEFT JOIN 
        user_jc cods 
        ON aods.user_id = cods.user_id 
      WHERE cods.jc_name LIKE '%ADM%') ods 
     FULL OUTER JOIN 
      (SELECT abl.user_id, 
        abl.firstname, 
        abl.lastname, 
        Abl.DEPARTMENT, 
        bbl.ug_name 
      FROM personas abl 
        LEFT JOIN 
        ru_ug bbl 
        ON abl.user_id = bbl.user_id 
      WHERE Bbl.UG_NAME LIKE '%ADM%' 
        AND bbl.rss_name = 'TIR') bl 
     ON ods.user_id = bl.user_id 

也許你想UNION如下[或UNION ALL]:

SELECT aods.user_id, 
      aods.firstname, 
      aods.lastname, 
      Aods.DEPARTMENT, 
      cods.jc_name 
    FROM personas aods 
      LEFT JOIN 
      user_jc cods 
      ON aods.user_id = cods.user_id 
    WHERE cods.jc_name LIKE '%ADM%' 

UNION SELECT abl.user_id, abl.firstname, abl.lastname , Abl.DEPARTMENT, bbl.ug_name FROM personas abl LEFT JOIN ru_ug桶 ON abl.user_id = bbl.user_id WHERE Bbl.UG_NAME LIKE '%ADM%' 和bbl.rss_name = 'TIR'