繁体   English   中英

内连接计数,多表

[英]Inner join with Count, multiple tables

我在使用 MS Access 来获取多个表上的正确计数时遇到问题。 我根本不是 SQL 请求方面的专家。

我有一组表格,其结构如下:

  • 表 1:UID、名称、其他信息
  • 表2:UID、FK_UID_Table1、名称、其他信息
  • 表3:UID、FK_UID_Table2、Name、其他信息
  • 表4:UID、FK_UID_Table3、Name、其他信息

每个 FK 引用是 1-N,其中 N >= 0。因此可能表 2 中的项目在表 3 FK 中没有引用。

我想要实现的是在一个查询中获取每个项目的计数。

例如,如果我在 Table1 中选择一个项目,我想得到:

Table1.Name | Count(Table2.UID) | Count(Table3.UID) | Count(Table4.UID)

我成功地通过一个 INNER JOIN 获得了确切的计数,如下所示:

SELECT g.UID, Table1.Name, COUNT(s.UID) AS CountTable2
FROM Table1 AS g INNER JOIN Table2 AS s ON s.FK_Table1 = g.UID
GROUP BY g.UID, g.Name

例如,在项目Table1谁得到2个参考Table2 ,并在3个参考Table3 ,我得到2的结果,这是正确的。

当我尝试添加另一层计数时,我执行了以下操作:

SELECT g.UID, g.Name, COUNT(s.UID) AS CountTable2, COUNT(p.UID) AS CountTable3
FROM (Table1 as g
INNER JOIN Table2 AS s ON s.FK_Table1 = g.UID)
INNER JOIN Table3 AS p ON p.FK_Table2 = s.UID
GROUP BY g.UID, g.Name, CountTable2, CountTable3

在我之前的示例中,结果不是CountTable2获得 2 和CountTable3获得 3,而是获得 3 和 3。

我读到这是 Access 的预期行为,但我没有找到如何使其工作。

我得到了这个问题的帮助: Inner join with count on三个表

任何帮助将不胜感激。

加入汇总:

SELECT g.UID, g.Name, s.CountTable2, p.CountTable3
FROM (Table1 g LEFT JOIN
      (SELECT s.FK_Table1, COUNT(*) as CountTable2
       FROM Table2
       GROUP BY s.FK_Table1
      ) AS s
      ON s.FK_Table1 = g.UID
     ) LEFT JOIN
     (SELECT s.FK_Table1, COUNT(*) as CountTable3
      FROM Table3 as p JOIN
           Table2 as s
           ON p.FK_Table2 = s.UID
      GROUP BY s.FK_Table1
     ) as p
     ON p.FK_Table1 = g.UID;

由于我无法通过 Gordon Linoff 的回答获得结果,因此我尝试了另一种使用 LEFT OUTER JOIN 的方法。

感谢这篇文章: 如何获得计数为零的组

我设法通过空关系获得了正确的结果(例如,一个项目 Table2 在 Table3 中没有引用),但是现在当我加入 2 个以上的表时,我得到了错误的结果。

我想这是我请求的问题...

目前 :

SELECT Table1.UID, Table1.Name
COUNT(Table2.UID) AS CountTable2
FROM Table1
LEFT OUTER JOIN Table2 ON Table2.FK_Table1 = Table1.UID
GROUP BY Table1.UID, Table1.Name

给了我一个正确的结果(只有两个表相关),但是:

SELECT Table1.UID, Table1.Name
COUNT(Table2.UID) AS CountTable2, COUNT(Table3.UID) AS CountTable3
FROM (Table1
LEFT OUTER JOIN Table2 ON Table2.FK_Table1 = Table1.UID)
LEFT OUTER JOIN Table3 ON Table3.FK_Table2 = Table2.UID
GROUP BY Table1.UID, Table1.Name

CountTable2 给了我一个错误的结果,这似乎超出了预期。 CountTable3 是正确的。

编辑 :

根据我的研究和 Gordon Linoff 在加入前聚合的提示,我终于想出了如何让它发挥作用。

我首先计算上表中最深的表,然后加入,依此类推。 在每一步,我都会选择要保留的基本信息:UID、FK_AboveTable、Count、Sums from deepest table。

最终代码:

SELECT Table1.UID, Table1.Name, COUNT(Table2.UID) AS TotalTable2, SUM(CountTable3) AS TotalTable3, SUM(CountTable4_2) AS TotalTable4
FROM Table1 LEFT OUTER JOIN (
    SELECT Table2.UID, Table2.FK_Table1, COUNT(Table3.UID) AS CountTable3, 
    SUM(CountTable4) AS CountTable4_2
    FROM Table2 LEFT OUTER JOIN (
        SELECT Table3.UID, Table3.FK_Table1, COUNT(Table4.UID) AS CountTable4
        FROM Port LEFT OUTER JOIN
            Table4 ON Table4.FK_Table3 = Table3.UID
            GROUP BY Table3.UID, Table3.FK_Table2
        ) Table3 ON Table3.FK_Table2 = Table2.UID
        GROUP BY Table2.UID, Table2.FK_Table1
    ) Table2 ON Table2.FK_Table1= Table1.UID
GROUP BY Table1.UID, Table1.Name ORDER BY Table1.Name DESC

请注意,最深表中出现的空计数为空且不为 0(例如,如果表 1 中有一项,表 2 中没有相关项,则表 2 的计数将为 0,表 3 和表 4 的计数将为空)。

我认为这可能会升级,但现在它解决了我的问题,并允许我根据需要添加尽可能多的表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM