2011-08-04 96 views
1

試圖瞭解在http://www.orafaq.com/papers/sqltiptr.pdfSQL - 從三個不相關的表在一個查詢中獲取數據

第九尖端組合三個單獨的查詢到一個:

select name from emp where emp_no=1234; 
select name from dpt where dot_no=10; 
select name from cat where emp_no='RD'; 


select e.name, d.name, c.name 
from cat c, dpt d, emp e, dual x 
where NVL('x',X.DUMMY)=NVL('X', E.ROWId (+)) 
and NVL('x',X.DUMMY)=NVL('X', D.ROWId (+)) 
and NVL('x',X.DUMMY)=NVL('X', C.ROWId (+)) 
and e.emp_no(+)=1234 
and d.dept_no(+)=10 
and c.cat_type(+)='RD' 

爲什麼我們需要在這些空值的比較查詢?

NVL('x',X.DUMMY)=NVL('X', E.ROWId (+)) 
and NVL('x',X.DUMMY)=NVL('X', D.ROWId (+)) 
and NVL('x',X.DUMMY)=NVL('X', C.ROWId (+)) 
+0

這給外部聯接的東西加入...它看起來有點有趣 – Randy

回答

3
select name from emp where emp_no=1234 
UNION ALL 
select name from dpt where dot_no=10 
UNION ALL 
select name from cat where emp_no='RD' 

,或者如果你希望所有的人都在一排:

SELECT (select name from emp where emp_no=1234) a, 
     (select name from dpt where dot_no=10) b, 
     (select name from cat where emp_no='RD') c 
    FROM DUAL 
+0

我認爲OP是不問如何選擇,他是問爲什麼在文檔中這樣做。 –

+0

這給了3行... OP正在尋找一行上的3個值... – Randy

+1

@Randy:更新了答案。 '外部連接'仍然不是一個很好的解決方案 – zerkms

2

這是一個非常深奧的竅門 - DUAL表有一排它,並在實際中的ROWID表格也是唯一的,所以使用NVL('X'..'是一種欺騙JOIN進入'關聯'無關記錄的方法,然後WHERE子句的其餘部分應用您以後的實際約束條件

我認爲zerkms的方法更多但是既然你問了具體關於那個提示... HTH

+0

感謝 - 有道理。但外連接也處於以下條件 - 我們是否仍然需要這樣做?我想我們可能會因爲連接在兩張桌子上? (如果是的話,如何加入一個表格字段並且值在下面有效?) 和e.emp_no(+)= 1234 和d.dept_no(+)= 10 和c.cat_type(+)='RD 「 – dsatish

相關問題