如何在一列中获取与另一列中的项匹配的项目数?

时间:2009-01-26 17:59:59

标签: sql sql-server tsql

假设我有两个数据表和一个链接表:


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

2个问题:

  1. 我想写一个查询,以便我拥有A的所有列以及与A链接的B的数量,这是最好的方法吗?

  2. 有没有办法让查询返回一行,其中包含A中的所有列以及包含来自B的所有链接名称的列(可能由某些分隔符分隔?)< / p>

  3. 请注意查询必须从A 返回不同的行,因此一个简单的左外连接在这里不起作用...我猜我需要嵌套的select语句?

3 个答案:

答案 0 :(得分:3)

#1

SELECT A.*, 
(SELECT COUNT(*) FROM A_B_Link WHERE A_B_Link.A_ID = AOuter.A_ID)
FROM A as AOuter

答案 1 :(得分: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中,你可以得到一个逗号分隔的每行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中没有简单的等效内容。在这里查看有关此问题的另一个问题: “Simulating group_concat MySQL function in MS SQL Server 2005?

或谷歌为'microsoft SQL server "group_concat"'提供各种其他解决方案。

答案 2 :(得分:2)

SELECT A.*, COUNT(B_ID)
FROM A
LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID