2009-01-26 52 views
2

假設我有兩個數據表和鏈接表這樣:如何獲得一列中與另一列中的項目相匹配的項目數?

 

A   B   A_B_Link   
-----  -----  ----- 
ID  ID  A_ID 
Name  Name  B_ID 

2個問題:

  1. 我想編寫一個查詢,使我有A的所有列和count有多少B與A鏈接,最好的方法是什麼?

  2. 有沒有辦法有一個查詢返回的行與所有從A柱和含有的B鏈接名稱(或許通過一些分隔符分隔?)

的所有列請注意,查詢必須從A返回不同的行,所以一個簡單的左外連接不會在這裏工作......我猜我需要嵌套的select語句?

+0

你應該在堆棧溢出上發佈兩個問題 - 你的問題不相關,你不會得到像這樣分組的好答案。 – 2009-01-26 18:21:18

回答

3

關於第一個問題:

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中,你可以得到一個逗號分隔的B.Name列表每行A的是這樣的:

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。在這裏檢查另一個關於這個問題: 「Simulating group_concat MySQL function in MS SQL Server 2005?

或谷歌的'microsoft SQL server "group_concat"'的各種其他解決方案。

3

#1

SELECT A.*, 
(SELECT COUNT(*) FROM A_B_Link WHERE A_B_Link.A_ID = AOuter.A_ID) 
FROM A as AOuter 
2
SELECT A.*, COUNT(B_ID) 
FROM A 
LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID 
+0

我想你錯過了GROUP BY語句。 – mmattax 2009-01-26 18:25:12

+0

呃,當然:( – 2009-01-26 19:49:26

相關問題