簡體   English   中英

如何在我的SQL語句中聯接第三個表,該表返回一個COUNT而不丟失0個計數項?

[英]How do I JOIN a third table in my SQL statement which returns a COUNT without losing the 0 count items?

從這個問題繼續, 我需要一條SQL語句,該語句返回具有特定值的表中的行數。

我們從下面開始執行一條SQL語句...

   SELECT t.teamid,
          t.teamname,
          COALESCE(COUNT(p.playerid), 0) AS playercount,
          t.rosterspots
     FROM TEAMS t
LEFT JOIN PLAYERS p ON p.teamid = t.teamid
 GROUP BY t.teamid, t.teamname, t.rosterspots

我還有一個要添加的約束。 如果玩家要計入“玩家人數”,該如何通過體檢?

我將介紹桌子。

MedicalTests
PlayerId  PassedMedical
1         1
2         0
3         1
4         1

其中“ PassedMedical”有點(1 = true)。

並且還將1 ROW的其他數據添加到Teams表中。

TeamId    Team Name
3         Toronto Rapters

這樣我就有了一個擁有0名球員的球隊。

預期的輸出變為:

Team Name         PlayerCount
Miami Heat        2
New York Knicks   1
Toronto Rapters   0

因為一位邁阿密熱火隊的球員尚未通過醫療檢查。

如果我加

LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
WHERE m.PassedMedical = 1

對於上面的語句,我丟失了所有的“ 0”行?

謝謝,
賈斯汀

LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
WHERE m.PassedMedical = 1

那是矛盾的。 您是說這是一個左聯接,因此不需要存在MEDICALTESTS記錄,但是然后說該記錄實際上必須存在並且具有1作為PassedMedical。 因此,實際上,您的左聯接成為內部聯接,並且同樣,由於必須具有MEDICALTESTS行,因此還必須具有PLAYERS行,因此也將成為內部聯接。

嘗試以下方法:

INNER JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId and m.PassedMedical = 1

不確定SQL Server如何解釋FROM foo LEFT JOIN欄INNER JOIN baz ...您希望它將其解釋為FROM foo LEFT JOIN(bar INNER JOIN baz)。 如果那不起作用,請使用子選擇; 不加入,只需添加:

WHERE p.PlayerId IS NULL or (select PassedMedical from MEDICALTESTS m where m.PlayerId=p.PlayerID) = 1 

希望盡管我對SQL Server不熟悉,但對您有所幫助。

如果我誤解了這個問題,請原諒我,但我認為沒有必要將左聯接加入玩家表。 我們只需要球員人數。 為什么不這樣:

SELECT t.teamid,
          t.teamname, 
          (SELECT COUNT(*) FROM players inner join medicaltests on players.playerid = medicaltests.playerid where players.teamid = t.teamid and medicaltests.passedmedical = 1) AS playercount,
          t.rosterspots
     FROM TEAMS t
 GROUP BY t.teamid, t.teamname, t.rosterspots

為什么不將其作為計算列呢?

SELECT
    t.teamid, 
    t.teamname,
    (SELECT COUNT(*) FROM MEDICALTESTS m WHERE p.PlayerId = m.PlayerId and m.PassedMedical = 1 ) AS PassedMedicalCount

請閱讀以下內容以了解您遇到的問題: http : //wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

基本上,通過將條件放在哪里,您可以將左聯接轉換為內部聯接。 嘗試以下方法:

LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId 
and m.PassedMedical = 1 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM