假设我有两个数据表和一个链接表:
A B A_B_Link ----- ----- ----- ID ID A_ID Name Name B_ID
2 个问题:
我想编写一个查询,以便我拥有 A 的所有列并计算有多少 B 链接到 A,最好的方法是什么?
有没有办法让查询返回一行,其中包含来自 A 的所有列,以及包含来自 B 的 所有 个链接名称的列(可能由某些分隔符分隔?)
请注意,查询必须从 A 返回不同的行,所以简单的左外连接在这里不起作用……我猜我需要嵌套的 select 语句? p>
最佳答案
第一个问题:
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 中没有简单的等价物。在此处查看有关 SO 的另一个问题: "Simulating group_concat MySQL function in MS SQL Server 2005? "
或谷歌搜索' microsoft SQL server "group_concat" ' 用于各种其他解决方案。
关于sql - 如何获取与另一列中的项目匹配的一列中的项目计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/480730/