如何使用带有过滤器where子句的oracle外连接

时间:2013-08-22 20:52:10

标签: sql oracle11g outer-join

如果我写了一个sql:

select * 
from a,b 
where     a.id=b.id(+) 
      and b.val="test"

并且我希望b中相应记录所在的所有记录都不存在或者存在val =“test”,这是正确的查询吗?

4 个答案:

答案 0 :(得分:15)

使用ANSI语法

会好得多
SELECT *
  FROM a
       LEFT OUTER JOIN b ON( a.id = b.id and
                             b.val = 'test' )

你也可以使用Oracle的语法做同样的事情,但它有点过分了

SELECT *
  FROM a, 
       b
 WHERE a.id = b.id(+)
   AND b.val(+) = 'test'

请注意,在这两种情况下,我都忽略了c表,因为您没有指定连接条件。而且我假设你真的不想加入A到B然后用C生成笛卡尔积。

答案 1 :(得分:1)

将条件移入JOIN子句并使用ANSI标准连接模式。

SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...

答案 2 :(得分:1)

SELECT * FROM abc a, xyz b
 WHERE a.id = b.id
   AND b.val = 'test'

答案 3 :(得分:0)

LEFT OUTER JOIN是允许您指定连接子句的JOIN操作之一。它保留了第一个(左)表中不匹配的行,将它们与第二个(右)表形状的NULL行连接起来。

所以你可以这样做:

选择
   从左外联接b    在a.id = b.id

- 请注意,您使用了双引号“test”,它不用于SQL中的varchar,您应该使用单引号'test'

AND b.val ='test';