SQL加入两个表,但仅限于显式存在某些条件的情况

时间:2016-11-30 11:31:06

标签: sql join

出于某种原因,我不能把头包裹起来。我有两个表,当连接表中的所有相关行满足特定条件时,我需要从其中一个表返回一个字段。表格的简化版本:

COMPONENT:

RegionAcronym

OfficeCode


OFFICE:

OfficeCode

LimitSwitch

CloseDate

当我使用RegionAcronym的每个OfficeCode将LimitSwitch设置为' Y'时,我需要从COMPONENT获取RegionAcronym。和CloseDate为NULL或> OFFICE的CURRENT_DATE。我遇到的问题是COMPONENT表中有OfficeCode,而OFFICE表中没有条目。

我试过了:

SELECT c.RegionAcronym FROM cmpnt c 
LEFT JOIN Office o
ON o.OfficeCode = c.OfficeCode AND o.LimitSwitch = 'Y' 
AND (o.CloseDate =  NULL or o.CloseDate > CURRENT_DATE
GROUP BY c.RegionAcronym
HAVING COUNT(o.OfficeCode) = COUNT(c.OfficeCode)

这不会返回正确的首字母缩略词。我相信当OFFICE中没有记录时,它不会在COMPONENT表中排除OfficeCodes。

提前致谢。

3 个答案:

答案 0 :(得分:2)

要进行表连接,您可以设置加入ON子句中行的条件。

您发布的代码的问题是您无法使用=运算符将列与NULL进行比较,您必须使用IS NULL或IS NOT NULL以便更改

AND (o.CloseDate =  NULL or o.CloseDate > CURRENT_DATE

AND (o.CloseDate IS NULL or o.CloseDate > CURRENT_DATE

答案 1 :(得分:1)

如果我理解正确,那么NOT EXISTS似乎是表达这一点的好方法:

SELECT c.RegionAcronym
FROM cmpnt c
WHERE NOT EXISTS (SELECT 1
                  FROM Office o
                  WHERE o.OfficeCode = c.OfficeCode AND
                        NOT (o.LimitSwitch = 'Y' AND
                             (o.CloseDate IS NULL OR o.CLoseDate > CURRENT_DATE)
                            )
                 )

就性能而言,这不需要聚合。

答案 2 :(得分:0)

如果您使用的是SQL SERVER,请将CURRENT_DATE更改为GETDATE()

SELECT c.RegionAcronym FROM cmpnt c 
LEFT JOIN Office o
ON o.OfficeCode = c.OfficeCode
WHERE NOT (o.LimitSwitch = 'Y' 
            AND (o.CloseDate IS NULL or o.CloseDate > CURRENT_DATE))
GROUP BY c.RegionAcronym