SQL - 在一个查询中从三个不相关的表中获取数据

时间:2011-08-04 01:44:06

标签: sql oracle

尝试理解http://www.orafaq.com/papers/sqltiptr.pdf

中的第9个提示

将三个单独的查询合并为一个:

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 (+))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是一个非常深奥的技巧 - DUAL表中有一行,而实际表中的ROWID也是唯一的,因此使用NVL('X'...是一种将JOIN欺骗为'关联'的方法不相关的记录。然后WHERE子句的其余部分应用你所追求的实际约束。

我认为zerkms的方法更直接,但是因为你特别询问了这个提示...... HTH