如果我写一个sql:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
我想要来自a的所有记录,其中b中的相应记录不存在或者它存在val =“test”,这是正确的查询吗?
如果我写一个sql:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
我想要来自a的所有记录,其中b中的相应记录不存在或者它存在val =“test”,这是正确的查询吗?
你最好使用 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 生成笛卡尔积。
将条件移动到JOIN
子句中并使用 ANSI 标准连接模式。
SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
LEFT OUTER JOIN 是允许您指定连接子句的 JOIN 操作之一。它保留第一个(左)表中不匹配的行,将它们与第二个(右)表形状的 NULL 行连接起来。
所以你可以这样做:
从 a.id = b.id 上的左外连接 b 中选择
--请注意,您使用了双引号“test”,它在 SQL 中不用于 varchar,您应该使用单引号“test”
AND b.val = '测试';
SELECT * FROM abc a, xyz b
WHERE a.id = b.id
AND b.val = 'test'