【问题标题】:How to use oracle outer join with a filter where clause如何使用带有过滤器 where 子句的 oracle 外连接
【发布时间】: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 ?

标签: sql oracle11g outer-join


【解决方案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 问题的详细信息来扩展您的答案,那将非常有帮助。
      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多