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

标签 sql sql-server tsql

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


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

2 个问题:

  1. 我想编写一个查询,以便我拥有 A 的所有列并计算有多少 B 链接到 A,最好的方法是什么?

  2. 有没有办法让查询返回一行,其中包含来自 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/

相关文章:

python - pandas dataframe header 与 sql 表头的关系

java - 带有用于搜索 Web 应用程序的可选字段的 SQL 查询

mysql - 在MySQL中计算上午6点之前和晚上10点之后的时间差

sql - 如何根据其他列中存在的值选择行

TSQL:确定存储过程返回的列数

tsql - 谁有 URL 缩短 T-Sql 代码?

sql - 查找表中每个 ID 的最大连续年份(Oracle SQL)

sql-server - 找出 sql server 硬件或速度测试

sql - 使用存储过程将记录从详细信息表移动到历史表

sql - 使用记录 ID 列表作为输入更新 SQL 服务器中的 400 万条记录