2014-11-06 15 views
0

我有兩個表,T1T2具有相同的一組列。我需要發出一個查詢,它將返回來自任何一個表的列的值,而不是null。如果兩列均爲null,則返回null作爲該列的值。從Oracle中的兩個表中返回非空值

列爲c1,c2,c3,cond1。

我發出以下查詢。問題是如果一個子查詢失敗,整個查詢失敗。有人請幫助我。可能還有另一種簡單的方法。

SELECT NVL(T1.c1, T2.c1) c1,NVL(T1.c2, T2.c2) c2,NVL(T1.c3, T2.c3) c3 
FROM (SELECT c1,c2,c3 
     FROM T1 
     WHERE cond1 = 'T10') T1 
     ,(SELECT c1,c2,c3 
     FROM T2 
     WHERE cond1 = 'T200') T2 ; 
+0

你過於簡化你的榜樣?或者你從T1中取出一行,如果它爲空,則從T2取出一行?或者你錯過了表格之間的連接條件? – Captain 2014-11-06 11:42:36

+0

這是一個真實的例子。如果可用,我只想獲得T1表的價值。否則返回T2表中的值。如果這兩個子查詢都返回一行,這將起作用。但是,如果一個子查詢返回0行,那麼整個查詢將不返回任何內容。但需要從其他子查詢中返回值。可能是我沒有按照正確的方式去做。 – 2014-11-06 11:55:05

回答

0

你需要的東西是這樣的:

SELECT NVL((SELECT T1.c1 
       FROM T1 
      WHERE T1.c2 = 'T10'), 
      (SELECT T2.c1 
       FROM T2 
      WHERE T2.c2 = 'T200')) AS c1 
FROM dual 

或者,你可能更喜歡full outer join

SELECT NVL(T1.c1, T2.c1) AS c1 
      FROM T1  FULL OUTER JOIN T2 ON 1=1 
     WHERE T1.c2 = 'T10' 
      AND T2.c2 = 'T200' 

你的結果是合乎邏輯的。如果第一個表爲空,則natural join中不存在任何值組合。

編輯。在一些新的要求之後,我們可以使用黑客來獲得該行。讓我們得到的所有三種可能性,T1,T2或全部空並選擇第一個:

SELECT * 
    FROM ((SELECT T1.* 
      FROM T1 
      WHERE T1.c2 = 'T10') 
     UNION ALL 
     (SELECT T2.* 
      FROM T2 
      WHERE T2.c2 = 'T200') 
     UNION ALL 
     (SELECT T2.* 
      FROM dual 
     LEFT JOIN T1 ON 1 = 0)) 
    WHERE ROWNUM = 1 
+0

如果T2爲NULL而不是T1,該怎麼辦?在這種情況下,RIGHT JOIN不會返回單個記錄。會嗎? – borjab 2014-11-06 12:00:54

+0

謝謝,您的查詢是正確的。但是,我的原始表格大約有100列,我想在單個查詢中返回所有這些列的全部行,例如 – 2014-11-06 12:02:58

+0

好點的borjab!我要刪除我的評論,以免混淆任何人! – Captain 2014-11-06 12:04:38