9

如果我写一个sql:

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

我想要来自a的所有记录,其中b中的相应记录不存在或者它存在val =“test”,这是正确的查询吗?

4

4 回答 4

20

你最好使用 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 生成笛卡尔积。

于 2013-08-22T21:01:04.027 回答
1

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

SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
于 2013-08-22T21:00:29.767 回答
0

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

所以你可以这样做:


从 a.id = b.id 上的左外连接 b 中选择

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

AND b.val = '测试';

于 2013-08-22T21:14:16.160 回答
-1
SELECT * FROM abc a, xyz b
 WHERE a.id = b.id
   AND b.val = 'test'
于 2016-08-03T13:28:45.670 回答