尝试理解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 (+))
答案 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