如何使用带有过滤器 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(条件)子句用法

Oracle Where(条件)子句用法

Oracle:有效地使用where子句过滤时间戳列以获取特定日期的所有记录

Oracle SQL - 带有 Where 子句的插入语句

如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?

Oracle where 子句中的 case 表达式