从主 table 中选择记录并在另一个 table 中选择每行的计数

selecting records from main table and count of each row in another table

我的数据库中有 2 个 table table 与外键相关 我想 select 来自 main table 的所有记录,然后 select 计数另一个 table 中的每一行,而不是来自 main table 的相同 ID 我试图创建select 查询但无法正常工作 此查询 return 来自主要的所有记录 table + 来自下一个 table 的所有记录的计数(不是关系中每一行的计数)

    SELECT tblForumSubGroups_1.id, tblForumSubGroups_1.GroupID,
    tblForumSubGroups_1.SubGroupTitle, tblForumSubGroups_1.SubGroupDesc,
    (SELECT COUNT(dbo.tblForumPosts.id) AS Expr1
    FROM dbo.tblForumSubGroups INNER JOIN dbo.tblForumPosts ON 
    dbo.tblForumSubGroups.id = dbo.tblForumPosts.SubGroupID) AS Expr1
    FROM dbo.tblForumSubGroups AS tblForumSubGroups_1 INNER JOIN
    dbo.tblForumPosts AS tblForumPosts_1 ON tblForumSubGroups_1.id 
    = tblForumPosts_1.SubGroupID
SELECT  tblForumSubGroups_1.id, tblForumSubGroups_1.GroupID, tblForumSubGroups_1.SubGroupTitle, tblForumSubGroups_1.SubGroupDesc,
        COUNT(tblForumPosts_1.id) AS Expr1
FROM    dbo.tblForumSubGroups AS tblForumSubGroups_1
INNER JOIN  dbo.tblForumPosts AS tblForumPosts_1 ON tblForumSubGroups_1.id = tblForumPosts_1.SubGroupID
GROUP BY tblForumSubGroups_1.id, tblForumSubGroups_1.GroupID, tblForumSubGroups_1.SubGroupTitle, tblForumSubGroups_1.SubGroupDesc

不要混合使用子查询和连接逻辑。只使用其中一个。我比较喜欢sub-select.

SELECT tblForumSubGroups_1.id,
       tblForumSubGroups_1.GroupID,
       tblForumSubGroups_1.SubGroupTitle,
       tblForumSubGroups_1.SubGroupDesc,
       (SELECT COUNT(*)
        FROM dbo.tblForumPosts
        WHERE dbo.tblForumSubGroups.id = dbo.tblForumPosts.SubGroupID) AS Expr1
FROM dbo.tblForumSubGroups AS tblForumSubGroups_1

我建议交叉应用,因为你可以用它做更多的事情...

SELECT t1.id,
   t1.GroupID,
   t1.SubGroupTitle,
   t1.SubGroupDesc,
   t2.val
FROM dbo.tblForumSubGroups AS t1
cross apply (SELECT COUNT(*)
         FROM dbo.tblForumPosts as t2
         WHERE t1.id = t2.SubGroupID) x(val)

虽然我认为交叉应用可能是最好的选择,但只是提供另一个答案:

SELECT 
    A.id, A.GroupID, A.SubGroupTitle, A.SubGroupDesc,
    B.IDCount AS Expr1
FROM dbo.tblForumSubGroups A 
INNER JOIN (
    Select SubGroupID, Count(ID) as IDCount
    from dbo.tblForumPosts
    Group By SubGroupID
) B On A.ID = B.SubGroupID