【问题标题】:Oracle left outer join return 0 rows with data in left datasetOracle左外连接返回0行,左数据集中有数据
【发布时间】:2017-11-18 00:03:17
【问题描述】:

我正在尝试获取硬编码事件的列表并加入包含实际事件的表格,这样我就可以实际查看它们是否已执行。

这是我的查询:

SELECT a.Verification FROM (SELECT 'Verify ID changed' as Verification  FROM DUAL
UNION ALL
SELECT 'Verify manual Valve closed' as Verification FROM DUAL
UNION ALL
SELECT 'Verify manual Valve open' as Verification FROM DUAL
UNION ALL
SELECT 'Visually verify Things' as Verification FROM DUAL
) a
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC
WHERE c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017'

当我阅读 LEFT Outer join 的文档时,队列应该始终返回左表中的数据,那么为什么我的查询返回 0 行(JOBEVENTS 事件表中没有任何内容,但留下的硬编码值总是那里)。

我是否误解了 LEFT OUTER JOIN 的工作原理?

【问题讨论】:

  • 您的 where 子句依赖于左连接的数据。如果左连接不匹配,那么你的 where 子句也将不匹配。

标签: oracle join


【解决方案1】:

使左连接表上的过滤器成为连接的一部分,而不是 where 子句。

SELECT a.Verification, c.*
FROM (
      SELECT 'Verify ID changed' as Verification  FROM DUAL UNION ALL
      SELECT 'Verify manual Valve closed' as Verification FROM DUAL UNION ALL
      SELECT 'Verify manual Valve open' as Verification FROM DUAL UNION ALL
      SELECT 'Visually verify Things' as Verification FROM DUAL
      ) a
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC
       AND c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017'
;

或者,您可以添加到 where 子句,以便可以从左连接表返回 NULLS。例如:

SELECT a.Verification, c.*
FROM (
      SELECT 'Verify ID changed' as Verification  FROM DUAL UNION ALL
      SELECT 'Verify manual Valve closed' as Verification FROM DUAL UNION ALL
      SELECT 'Verify manual Valve open' as Verification FROM DUAL UNION ALL
      SELECT 'Visually verify Things' as Verification FROM DUAL
      ) a
LEFT OUTER JOIN JOBEVENTS c ON a.Verification = c.EVENTDESC
WHERE ( c.EVT_TIME BETWEEN '22-Jan-2017' AND '22-Jan-2017'
      OR c.EVENTDESC IS NULL
      )
;

当在 where 子句中引用外部联接表时,请务必注意允许该表中的 NULLS,否则您会创建内部联接(有时称为“隐含内部联接”)的等效条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2016-10-02
    • 1970-01-01
    • 2010-11-30
    • 2018-05-23
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多