如果我写了一个sql:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
并且我希望b中相应记录所在的所有记录都不存在或者存在val =“test”,这是正确的查询吗?
答案 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';