假设我有两个数据表和一个链接表:
A B A_B_Link ----- ----- ----- ID ID A_ID Name Name B_ID
2个问题:
我想写一个查询,以便我拥有A的所有列以及与A链接的B的数量,这是最好的方法吗?
有没有办法让查询返回一行,其中包含A中的所有列以及包含来自B的所有链接名称的列(可能由某些分隔符分隔?)< / p>
请注意查询必须从A 返回不同的行,因此一个简单的左外连接在这里不起作用...我猜我需要嵌套的select语句?
答案 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