如何使用带有过滤器 where 子句的 oracle 外连接
Posted
技术标签:
【中文标题】如何使用带有过滤器 where 子句的 oracle 外连接【英文标题】:How to use oracle outer join with a filter where clause 【发布时间】:2013-08-25 18:46:47 【问题描述】:如果我写一个sql:
select *
from a,b
where a.id=b.id(+)
and b.val="test"
我想要来自 a 的所有记录,其中 b 中的相应记录不存在或者它存在于 val="test",这是正确的查询吗?
【问题讨论】:
你有多少张桌子,什么是 a.b 和 c ? 【参考方案1】:使用 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 生成笛卡尔积。
【讨论】:
这是正确的吗:SELECT * FROM a, b WHERE a.id = b.id(+) AND b.val(+) = 'test' and b.col2(+) = 'test2 ';如果 b 中的相应行为空或 b 中的相应行有 col2='test2' 和 val = 'test',我希望从 a 中获取所有行所以,它要么是 null 要么 (col2='test2' AND val = 'test ')【参考方案2】:将条件移入JOIN
子句并使用ANSI 标准连接模式。
SELECT NameYourFields,...
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID
AND B.VAL = 'test'
INNER JOIN C
ON ...
【讨论】:
【参考方案3】:LEFT OUTER JOIN 是允许您指定连接子句的 JOIN 操作之一。它保留第一个(左)表中不匹配的行,将它们与第二个(右)表形状的 NULL 行连接起来。
所以你可以这样做:
选择 从左外连接 b ON a.id = b.id
--请注意,您使用了双引号“test”,它在 SQL 中不用于 varchar,您应该使用单引号 'test'
AND b.val = '测试';
【讨论】:
【参考方案4】:SELECT * FROM abc a, xyz b
WHERE a.id = b.id
AND b.val = 'test'
【讨论】:
您好,欢迎来到 SO。感谢您的贡献,但如果您可以通过一些有关如何回答 Victors 问题的详细信息来扩展您的答案,那将非常有帮助。以上是关于如何使用带有过滤器 where 子句的 oracle 外连接的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:有效地使用where子句过滤时间戳列以获取特定日期的所有记录