【问题标题】:How do I get a count of items in one column that match items in another column?如何获取与另一列中的项目匹配的一列中的项目计数?
【发布时间】:2009-01-26 17:59:58
【问题描述】:

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

A B A_B_链接 ----- ----- ----- ID ID A_ID 名称 名称 B_ID

2 个问题:

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

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

请注意,查询必须从 A 返回不同的行,所以简单的左外连接在这里不起作用……我猜我需要嵌套的 select 语句? p>

【问题讨论】:

  • 您应该在堆栈溢出上发布两个问题 - 您的问题不相关,并且您不会得到像这样分组的好答案。

标签: sql sql-server tsql


【解决方案1】:

第一个问题:

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?"

或在 Google 中搜索“microsoft SQL server "group_concat"”以获取各种其他解决方案。

【讨论】:

  • 不错的账单,我不太确定您的解决方案,所以我按照我所知道的去做了。 ;)
【解决方案2】:

对于#1

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

【讨论】:

    【解决方案3】:
    SELECT A.*, COUNT(B_ID)
    FROM A
    LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID
    

    【讨论】:

    • 我认为您缺少 GROUP BY 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多