簡體   English   中英

如何獲得一列中與另一列中的項目匹配的項目計數?

[英]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個問題:

  1. 我想編寫一個查詢,以便我擁有A的所有列,並算出有多少B鏈接到A,這樣做的最佳方法是什么?

  2. 有沒有一種方法可以讓查詢返回包含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.

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