MSSQL选择所有引用计数的单行

时间:2012-11-08 19:33:59

标签: sql sql-server sql-server-2008

我正在尝试使用MSSQL做一些我认为可能(很容易)的事情,但我不知道如何发出正确的搜索字符串。我有以下情况。

Table A
UID  | Value....
1    | a
2    | b
3    | c


Table B
PartTypes_uid_fk   | Value....
1           | a
1           | b
1           | c
1           | d
1           | e
3           | 67
3           | 1354

我试图获得以下结果,查询表A以获取所有结果{TableA。*}并在同一行结果中显示表b引用的数量{count TableB.tableA_fk} 到目前为止我所拥有的是以下内容。

SELECT DISTINCT t1.uid, CONVERT(varchar(MAX), t1.Name) AS Name, CONVERT(varchar(MAX), t1.Description) AS Description, Count(t2.Items_uid_fk) OVER (Partition By t2.PartTypes_uid_fk) as Count FROM [Table1] as t1 left outer join Table2 as t2 on t2.PartTypes_uid_fk=t1.uid;

这适用于表B中具有相关记录的所有表A记录,但如果表B中有0个条目则不起作用。由于varchars是ntext格式并且它是不同的,因此需要转换varchars。

提前感谢您的帮助。 斯蒂芬

2 个答案:

答案 0 :(得分:1)

您可能希望预先聚合B表和LEFT JOIN,而不是遇到GROUP BY on N/TEXT列的问题,并且运行得更快。

select t1.*, ISNULL(t2.c, 0) AS CountOfB
from table1 t1
left join
(
    select parttypes_uid_fk, count(*) c
    from table2
    group by parttypes_uid_fk
) t2 on t2.PartTypes_uid_fk=t1.uid

答案 1 :(得分:0)

比这更容易:

SELECT t1.uid, t1.Name, COUNT(*)
FROM [Table1] t1
LEFT JOIN [Table2] t2 ON t2.PartTypes_uid_fk = t1.uid
GROUP BY t1.uid, t1.Name