出于某种原因,我不能把头包裹起来。我有两个表,当连接表中的所有相关行满足特定条件时,我需要从其中一个表返回一个字段。表格的简化版本:
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。
提前致谢。
答案 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