目前,我正在提取Facilities
permitType
为'Hazardous waste'
且licenseStatus
为'Open'
的{{1}},但有时会出现设施有多个许可类型,假设一个设施可以有两种许可类型
所以我不应该在我的输出中显示这个设施,如果除了'危险废物'之外的其他许可类型(状态 - 开放),但如果其他许可类型有状态 - 关闭然后我的查询应该输出设施,即如果AST(状态 - 关闭)然后应该从数据库中提取设施。
我编写了以下查询但不确定包含条件的位置。
SELECT
e.facilityID
,f.organization_core AS 'Facility Name'
,f.address_full_core AS 'Facility Address'
,a.permitNumber AS 'Permit Number'
,b.permitName AS 'Permit Name'
,a.licenseStatus AS 'Permit Status'
,c.permitType AS 'Permit Type'
FROM
tblPermits a
LEFT JOIN
dbo.tblPermit_Names b ON a.permitID = b.permitID
LEFT JOIN
dbo.tblLKP_Permit_Facilities d ON a.permitID = d.permitID
LEFT JOIN
dbo.tblPermit_Types c ON a.permitTypeID = c.permitTypeID
LEFT JOIN
dbo.tblFacility e ON d.facilityID = e.facilityID
LEFT JOIN
dbo.tblAddresses f ON e.facilityAddressID = f.addressID
WHERE
a.permitTypeID IN (SELECT permitTypeID
FROM dbo.tblPermit_Types
WHERE permitType IN ('Hazardous Waste'))
AND a.licenseStatus = 'Open'
AND isNull(a.deleted, 0) = 0
答案 0 :(得分:0)
我认为以下查询实现了您的规则。我们的想法是关注设施,而不是关注你所放入的表格中的所有额外内容。你需要按facilityid
聚合,这样你就可以将逻辑应用于为每一个发布的所有许可:
SELECT f.facilityID
FROM dbo.tblFacility f join
dbo.tblLKP_Permit_Facilities pf
on pf.facilityID = f.facilityId join
tblPermits p
on pf.permitID = p.permitID join
dbo.tblPermit_Types pt
ON pt.permitTypeID = p.permitTypeID
GROUP BY f.facilityID
HAVING SUM(case when pt.permitType IN ('Hazardous Waste') and p.licenseStatus = 'Open'
then 1 else 0
end) > 0 and
SUM(case when pt.permitType NOT IN ('Hazardous Waste') and p.licenseStatus = 'Close'
then 1 else 0
end) > 0;
having
子句中的每个条件都适用于您的一条规则。
答案 1 :(得分:0)
我对你的桌子结构有点困惑,但这是我认为你应该做的。
你的where语句应该是id(从表中选择id,其中status = open,count(id)= 1 group by facility) 输入('危险废物')
where语句的第一部分将所有ID限制为每个设施只有一个开放类型的开放,第二部分将其限制为危险废物。
如果您拥有10个许可证,但只有一个有效,它会将其列入清单,但如果有效许可证不是危险废物,则会将其排除在外。
抱歉,我无法为您提供准确的代码。
此外,nix尽可能多的外连接。内部联接更快,更有可能代表您想要的数据。