【问题标题】:if statement in where clause because of outer join由于外部连接,where 子句中的 if 语句
【发布时间】:2018-04-20 09:52:17
【问题描述】:

我想用 where 子句在 2 条件下从表中选择一些值。

select a.value1
b.value2
c.value3
from a,b,c
where
a.header_id = b.header_id
and b.line_id = c.line_id(+)

如果 c.line_id 不为空,我有更多类似的 where 子句

c.active = 'Y'
c.active_date > sysdate

任何想法,如何使这个声明有效?

【问题讨论】:

  • 这看起来像 Oracle 代码。我们可以删除 Postgres 标记吗?
  • sry,我想标记 plsql。
  • 你能用现代语法重写你的查询吗? 删除 FROM 子句中的逗号并使用显式连接。
  • (+) oooooh...我记得从 90 年代初开始!请转成outer join -- 眼睛疼。
  • 原始查询中(+) 的目的是创建一个外连接(在古老的神秘语法中)任何引用表c 的后续谓词必须也有(+),例如c.active(+) = 'Y' (更好)使用更具可读性的现代语法,如下所示。

标签: sql oracle plsql


【解决方案1】:

使该语句起作用的最佳方法是使用 ANSI 连接重写它:

SELECT
    a.value1
,   b.value2
,   c.value3
FROM a
JOIN b ON a.header_id = b.header_id
LEFT OUTER JOIN c ON b.line_id = c.line_id

现在对于附加条件的位置毫无疑问 - 因为它仅适用于 c 为非空的行,所以您将其添加到 ON 子句中:

SELECT
    a.value1
,   b.value2
,   c.value3
FROM a
JOIN b ON a.header_id = b.header_id
LEFT OUTER JOIN c ON b.line_id = c.line_id
                 AND c.active = 'Y'
                 AND c.active_date > sysdate

【讨论】:

  • 感谢您将这个问题带入未来 25 年……呃……现在。
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多