[英]How do I get a count of items in one column that match items in another column?
假設我有兩個數據表和一個鏈接表,例如:
A B A_B_Link ----- ----- ----- ID ID A_ID Name Name B_ID
2個問題:
我想編寫一個查詢,以便我擁有A的所有列,並算出有多少B鏈接到A,這樣做的最佳方法是什么?
有沒有一種方法可以讓查詢返回包含A中所有列的行和包含B中所有鏈接名稱的列(可能由某些定界符分隔)?
請注意, 查詢必須返回與A截然不同的行 ,因此,簡單的左外部聯接在這里不起作用...我猜測我將需要嵌套的select語句?
對於#1
SELECT A.*,
(SELECT COUNT(*) FROM A_B_Link WHERE A_B_Link.A_ID = AOuter.A_ID)
FROM A as AOuter
對於第一個問題:
SELECT A.ID, A.Name, COUNT(ab.B_ID) AS bcount
FROM A LEFT JOIN A_B_Link ab ON (ab.A_ID = A.ID)
GROUP BY A.ID, A.Name;
這樣,A的每行輸出一行,並匹配B的計數。 注意,您必須在GROUP BY語句中列出A的所有列。 您無法在此處使用通配符。
一種替代解決方案是使用關聯的子查詢,如@Ray Booysen所示:
SELECT A.*,
(SELECT COUNT(*) FROM A_B_Link
WHERE A_B_Link.A_ID = A.A_ID) AS bcount
FROM A;
這行得通,但是相關的子查詢對性能不是很好。
對於第二個問題,您需要類似MySQL的GROUP_CONCAT()
聚合函數。 在MySQL中,您可以像這樣用A的每行獲取一個以逗號分隔的B.Name
列表:
SELECT A.*, GROUP_CONCAT(B.Name) AS bname_list
FROM A
LEFT OUTER JOIN A_B_Link ab ON (A.ID = ab.A_ID)
LEFT OUTER JOIN B ON (ab.B_ID = B.ID)
GROUP BY A.ID;
Microsoft SQL Server中沒有簡單的等效項。 在此處檢查有關此問題的另一個問題:“ 在MS SQL Server 2005中模擬group_concat MySQL函數? ”
或Google為“ Microsoft SQL服務器“ group_concat” ”提供各種其他解決方案。
SELECT A.*, COUNT(B_ID)
FROM A
LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.