2016-05-17 62 views
-1

下面的查詢是查詢的簡化版本,我有錯誤,下面顯示的這個較小的查詢有一個where子句,它有效地取消了我的左連接。SQL-複雜查詢左連接與哪裏

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 

再次,按我的第一個查詢我意識到我在哪裏打開我的左連接到內部聯接,但我已經嘗試了幾種不同的方法來解決這個問題無濟於事。我如何改變這個問題來解決這個問題?

樣本數據: 表1 /表2

enter image description here

什麼表1應該像 - 使用簡單的查詢:

enter image description here

+0

所以,如果你的'select'查詢與所有的'LEFT OUTER JOIN's返回數據,但是當你添加一個'WHERE'子句,它不?這是個問題嗎?是否具有Audit_Year的子句總是返回false? – Ash

+0

@Ashwin Nair No,本質上 - where子句將我的左連接變爲內連接,因此它刪除了我需要在C#中執行圖形的空值。 – Krono

+0

好的。因爲我們無法看到你的數據,所以你需要找出哪些子句在這裏取消你的數據:WHERE A.Audit_Year = @Year AND(@Agency IS NULL or ga.GA_LegalName = @Agency) AND( @AuditType爲空或@AuditType = AT.AuditType_Category) AND(@Audit_ID爲null或@Audit_ID = a.Audit_ID)' – Ash

回答

2

嘗試把條件從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 
+0

我已經試過了 - 但它返回的ID爲919到933的所有數據字段,我需要這兩個表,而不僅僅是上一年 – Krono

+0

您需要提供樣本數據和預期結果。我們無法看到您的顯示器或讀取您的想法。 –

+0

已更新@FelixPamittan – Krono

0
  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);

+0

這個輸出與我的示例數據沒有什麼不同 – Krono