2017-11-18 227 views
0

我试图获取硬编码事件的列表,并将其与实际事件加入表中,以便实际查看它们是否已执行。Oracle左外连接返回0行,其中包含左数据集中的数据

这里是我的查询:

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' 

当我阅读文档的左外连接,那么队列应始终从返回左表中的数据,那么,为什么我的查询返回0行(没有什么在JOBEVENTS事件表中,但是硬编码值始终存在)。

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

+0

您的Where子句依赖于来自左连接的数据。如果左连接不匹配,那么您的where子句也将无法匹配。 –

回答

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子句中引用时务必小心与外连接表,否则你创建一个内部的等价条件加入(&有时被称为“隐含的内部联接”) 。