oracle (+)高级混合用法求解

有一个句子
select a.* from a,b
where a.user_id=b.user_Id(+)
and b.bj(+)=1
and b.user_id is null;
结果是从a表滤除了b表中bj=1后的资料,求关于(+)和不用(+)混合的写法相关解释、教程及经验。
不是(+)的简单用法,是混合用法,大家看最后一行没有用(+),混合结果不是左连接,而是滤除。
sunchongkai505 的最后一个and应当改成where,和我的结果就一致了
select a.* from a left join b on a.user_id=b.user_id and b.bj=1 where b.user_id is null;
好像是先进行左链接然后再取b.user_id is null这个条件,而并列的连接是先条件,后链接,其实就是运算顺序的问题,好像有点儿道理吧。

你理解的很正确,不必过分纠结语法。
b.user_id is null 写在join 里面表示的是先滤除,也就是说先取b表中user_id 为空的结果集出来,再进行连接。

b.user_id is null 写在where里面表示后滤除,也就是先将连接的结果集取出来,再取连接后b.user_id为空的结果集出来。

有点绕。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-21

<p>右边有(+)就是左外联结,左边有(+)就是右外连接,左外联结就是把左边表所有数据全部展现,不管是否符合条件,右边表则展现符合条件的数据,右外连接相反。

你的sql相当于:

select a.* from a left join b on a.user_id=b.user_id and b.bj=1 and b.user_id is null;

追问

好像描述没有明白我的意思, 按照你的sql永远都是null

追答

可能我是答非所问了,刚看你补充说明,但是我这个sql不会永远都是null啊,除非a里面没有数据。

第2个回答  2014-01-21
简单来说,就是哪边有(+),哪边就是附表,就以主表为主,补齐。
相似回答