我無法理解為什么我的兩個 SQL 查詢在我期望它們相同時為高級管理人員的計數輸出不同的結果。
SELECT COMPANY.Company_Code, COMPANY.Founder, COUNT(SENIOR_MANAGER.Senior_Manager_Code)
FROM COMPANY INNER JOIN SENIOR_MANAGER
ON SENIOR_MANAGER.COMPANY_CODE = COMPANY.COMPANY_CODE
GROUP BY COMPANY.COMPANY_CODE, COMPANY.FOUNDER;
這個 SQL 查詢試圖找出不同公司有多少高級管理人員,結果如下:
C1 Angela 5
C10 Earl 2
C100 Aaron 4
C11 Robert 1
C12 Amy 6
但是,當我在另一個使用兩個內部連接的查詢中使用相同的條件時,我會得到另一組結果。這是我的查詢:
SELECT COMPANY.COMPANY_CODE, COMPANY.FOUNDER, COUNT(LEAD_MANAGER.LEAD_MANAGER_CODE),
COUNT(SENIOR_MANAGER.SENIOR_MANAGER_CODE)
FROM COMPANY INNER JOIN LEAD_MANAGER
ON COMPANY.COMPANY_CODE = LEAD_MANAGER.COMPANY_CODE
INNER JOIN SENIOR_MANAGER
ON SENIOR_MANAGER.COMPANY_CODE = COMPANY.COMPANY_CODE
GROUP BY COMPANY.COMPANY_CODE, COMPANY.FOUNDER;
結果如下:
C1 Angela 10 10
C10 Earl 2 2
C100 Aaron 8 8
C11 Robert 1 1
C12 Amy 12 12
第四列是高級管理人員的數量,出于某種原因與第三列具有相同的值,但與我展示的第一個查詢的值不同。有人可以解釋為什么結果不同嗎?我懷疑這可能是因為我錯誤地使用了內部聯接?
我期望的結果是第四列顯示第一個查詢中的值。
uj5u.com熱心網友回復:
由于您的雙連接查詢的計數反映了單連接查詢的倍數,因此您使用新連接重復計算以前不同的配對。
具體來說,在第一個查詢中COMPANY,SENIOR_MANAGER表可以有一對多的關系,其中一個不同的公司可以有多個高級經理。
然而,在包括在第二次查詢LEAD_MANAGER這將有更明顯的配對表COMPANY,你重復SENIOR_MANAGER多次為每一個相應的配對COMPANY和LEAD_MANAGER。
作為重復計算的解決方案,請考慮使用聚合子查詢(或CTE)加入:
SELECT agg_s.COMPANY_CODE,
agg_s.FOUNDER,
agg_s.SENIOR_MANAGER_COUNT.
agg_l.LEAD_MANAGER_COUNT
FROM
(SELECT c.COMPANY_CODE,
c.FOUNDER,
COUNT(s.SENIOR_MANAGER_CODE) AS SENIOR_MANAGER_COUNT
FROM COMPANY c
INNER JOIN SENIOR_MANAGER s
ON s.COMPANY_CODE = c.COMPANY_CODE
GROUP BY c.COMPANY_CODE,
c.FOUNDER
) AS agg_s
INNER JOIN
(SELECT c.COMPANY_CODE,
c.FOUNDER,
COUNT(l.LEAD_MANAGER_CODE) AS LEAD_MANAGER_COUNT
FROM COMPANY c
INNER JOIN LEAD_MANAGER l
ON c.COMPANY_CODE = l.COMPANY_CODE
GROUP BY c.COMPANY_CODE,
c.FOUNDER
) AS agg_l
ON agg_s.COMPANY_CODE = agg_l.COMPANY_CODE
AND agg_s.FOUNDER = agg_l.FOUNDER
更妙的是,考慮適當的歸一表的設計變化,你保持一個單一的 MANAGER與表TYPE的指標列SENIOR或LEAD。然后使用條件聚合運行單個查詢:
SELECT c.COMPANY_CODE,
c.FOUNDER,
COUNT(CASE WHEN m.TYPE = 'SENIOR' THEN 1 ELSE NULL END) AS SENIOR_MANAGER_COUNT,
COUNT(CASE WHEN m.TYPE = 'LEAD' THEN 1 ELSE NULL END) AS LEAD_MANAGER_COUNT
FROM COMPANY c
INNER JOIN MANAGER m
ON c.COMPANY_CODE = m.COMPANY_CODE
GROUP BY c.COMPANY_CODE,
c.FOUNDER;
uj5u.com熱心網友回復:
您的問題缺少有關資料的資訊(這可能是您收到反對票的原因),但答案似乎相當清楚。
每次連接新表時,結果集中的每一行都會乘以新表中該行的連接條件匹配的次數。
因此,您的結果顯示 C1、C100 和 C12 中的每一個都有兩個 LEAD_MANAGER。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/396729.html
