繁体   English   中英

SQL-使用WHERE的复杂查询左联接

[英]SQL - Complex Query LEFT JOIN with WHERE

下面的查询是我遇到错误的简化查询,下面显示的这个较小的查询以前有一个where子句,该子句实际上使我的左联接无效。

SELECT FC_Name, COUNT(F.Findings_ID) AS 'No_of_Findings'
FROM FindingCategories AS FC
LEFT OUTER JOIN Findingsubcategories AS FSC ON FSC.FC_ID = FC.FC_ID
LEFT OUTER JOIN Findings AS F ON F.FSC_ID = FSC.FSC_ID AND F.AU_ID = @Audit_ID
LEFT OUTER JOIN Audit AS A ON A.Audit_ID = F.AU_ID 
GROUP BY FC_Name

现在-不幸的是,我无法使用此查询来完成我要执行的操作:我需要在数据库中获取当前选择的详细信息以及上一年的值。 如下图所示:

SELECT A.Audit_ID, c.FC_Name, COUNT(c.FC_Name) AS 'No_of_Findings'
FROM Audit AS A
  LEFT OUTER JOIN Findings F on A.Audit_ID = f.AU_ID
  LEFT OUTER JOIN FindingCategories C on C.FC_ID = F.Findings_category_ID
  LEFT OUTER JOIN GovernmentAgencies GA on GA.GA_ID = A.GA_ID
  LEFT OUTER JOIN AuditType AT on AT.AuditType_ID = a.AuditType_ID 
WHERE A.Audit_Year= @Year AND (@Agency IS NULL OR ga.GA_LegalName = @Agency)
                           AND (@AuditType is null or @AuditType = AT.AuditType_Category)
                           AND (@Audit_ID is null or @Audit_ID  = a.Audit_ID)
GROUP BY A.Audit_Year, c.FC_Name, A.Audit_ID

SELECT a.Audit_ID, c.FC_Name, COUNT(c.FC_Name) AS 'No_of_Findings'
FROM Audit AS A
  LEFT OUTER JOIN Findings F on a.Audit_ID = f.AU_ID
  LEFT OUTER JOIN FindingCategories C on C.FC_ID = F.Findings_category_ID
  LEFT OUTER JOIN GovernmentAgencies GA on GA.GA_ID = a.GA_ID
  LEFT OUTER JOIN AuditType AT on AT.AuditType_ID = a.AuditType_ID
WHERE a.Audit_Year= '@Year-1 AND (@Agency IS NULL OR ga.GA_LegalName = @Agency)
                           AND (@AuditType is null or @AuditType = AT.AuditType_Category)
GROUP BY a.Audit_Year, c.FC_Name, a.Audit_ID

再次,根据我的第一个查询,我意识到我的WHERE将左连接变成了内部连接,但是我尝试了几种不同的方法来解决这个问题。 我该如何解决这个问题?

样本数据:Table1 / Table2

在此处输入图片说明

表1应该是什么样的-使用更简单的查询:

在此处输入图片说明

尝试将条件从WHERE子句放到ON子句:

SELECT 
    a.Audit_ID, 
    c.FC_Name, 
    COUNT(c.FC_Name) AS 'No_of_Findings'
FROM Audit AS A
LEFT OUTER JOIN Findings F 
    ON a.Audit_ID = f.AU_ID
LEFT OUTER JOIN FindingCategories C 
    ON C.FC_ID = F.Findings_category_ID
LEFT OUTER JOIN GovernmentAgencies GA 
    ON GA.GA_ID = a.GA_ID
    AND (@Agency IS NULL OR ga.GA_LegalName = @Agency)
LEFT OUTER JOIN AuditType AT 
    ON AT.AuditType_ID = a.AuditType_ID
    AND AT.Audit_Year = @Year - 1
    AND (@AuditType IS NULL OR @AuditType = AT.AuditType_Category)
GROUP BY a.Audit_Year, c.FC_Name, a.Audit_ID
  1. 也许在两年中将它们合并为一个查询。
  2. 使用CTE或子查询将过滤器应用于正确的结果集。
  3. 在可为空的参数上使用ISNULL。

WITH CTE AS (SELECT A.Audit_ID, A.Audit_Year, c.FC_Name, ga.GA_LegalName, AT.AuditType_Category, COUNT(c.FC_Name) AS 'No_of_Findings' FROM Audit AS A LEFT OUTER JOIN Findings F ON A.Audit_ID = f.AU_ID LEFT OUTER JOIN FindingCategories C ON C.FC_ID = F.Findings_category_ID LEFT OUTER JOIN GovernmentAgencies GA ON GA.GA_ID = A.GA_ID LEFT OUTER JOIN AuditType AT ON AT.AuditType_ID = a.AuditType_ID WHERE A.Audit_Year IN (@Year, @Year - 1) GROUP BY A.Audit_Year, c.FC_Name, ga.GA_LegalName, AT.AuditType_Category, A.Audit_ID) SELECT Audit_ID, Audit_Year, FC_Name, No_of_Findings FROM CTE WHERE GA_LegalName = ISNULL(@Agency, GA_LegalName) AND AuditType_Category = ISNULL(@AuditType, AuditType_Category) AND Audit_ID = ISNULL(@Audit_ID, Audit_ID);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM