与Count内部连接,多个表

时间:2020-03-06 15:00:03

标签: sql vba ms-access count inner-join

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

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

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

每个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中的一项在Table2中获得2个引用,在Table3中具有3个引用的项目,我得到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

在前面的示例中,我得到的是3和3,而不是CountTable2得到2和CountTable3得到3。

我了解到这是Access的预期行为,但是我没有找到使它起作用的方法。

这个问题帮助我: Inner join with count on three tables

我们将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:0)

加入之前

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;

答案 1 :(得分:0)

由于戈登·利诺夫(Gordon Linoff)的回答未能成功,我尝试了LEFT OUTER JOIN的另一种方法。

感谢这篇文章: How to get a group where the count is zero

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

我想我的要求有问题...

当前:

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,来自最深表的和。

最终代码:

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的计数为空)。

我认为可能会对其进行升级,但是现在它可以解决我的问题,并允许我添加所需数量的表。

相关问题