想要过滤SQL Server查询

时间:2014-04-23 19:37:58

标签: sql sql-server

目前,我正在提取Facilities permitType'Hazardous waste'licenseStatus'Open'的{​​{1}},但有时会出现设施有多个许可类型,假设一个设施可以有两种许可类型

  1. 危险废物(状态 - 开放)
  2. AST(OPEN)
  3. 所以我不应该在我的输出中显示这个设施,如果除了'危险废物'之外的其他许可类型(状态 - 开放),但如果其他许可类型有状态 - 关闭然后我的查询应该输出设施,即如果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
    

2 个答案:

答案 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尽可能多的外连接。内部联接更快,更有可能代表您想要的数据。