2014-05-01 75 views
0
select col_1, 
     col_2 
    from tbl_a A, 
     tbl_b B, 
     (select col_1,col_2 from tbl_c where clo_c_1 <> '1') C 
where A.col_1 = B.col_1 
    and A.col_2 = B.col_2 
    and (A.col_2 = B.col_2 
    or C.col_2 = A.col_2); 

我的環境是Oracle,當我運行這個SQL時,如果子SQL C沒有得到結果,那麼整個SQL返回NULL。如果C有一個適合其他condions的結果(非空)可能會有結果。有人會解釋爲什麼from區域的子SQL需要不爲NULL?非常感謝。爲什麼FROM區域中的子SQL不能爲空?

+1

您正在尋找一個外部聯接 - 當您停止在where子句中使用舊的和過時的隱式聯接但使用顯式的JOIN運算符時(這是Oracle推薦的外部聯接來執行外部聯接連接)。 –

+0

明白了,我當時不希望SQL太複雜,所以沒有考慮外連接。這真是一個解決方案。謝謝。 – Hare4096

回答

3

你需要把自己進入90年代,並開始使用標準聯接:

select col_1, 
     col_2 
    from tbl_a A 
      inner join 
     tbl_b B 
      on A.col_1 = B.col_1 
      and A.col_2 = B.col_2 
      left join 
     (select col_1,col_2 from tbl_c where clo_c_1 <> '1') C 
      on 
      C.col_2 = A.col_2 

作爲一個猜測。我不完全確定你的加入條件應該如何,但這是我的第一次嘗試。

1

這是預期的行爲。當您連接兩個結果集時,您只想獲得連接條件滿足的結果。如果標準不滿意,你應該沒有結果。

如果我運行查詢「讓我所有65歲以上的員工,並獲得他們的部門」,如果沒有超過65歲的員工,即使有一些部門在數據庫。

SELECT emp.name, dept.dept_name 
FROM emp 
JOIN dept 
ON  (emp.dept_no = dept.dept_no) 
WHERE emp.age > 65; 

正如有人說,如果你真的想要得到的行不管子查詢是否有任何結果,你需要使用一個外部聯接。

相關問題