[英]Inner join with Count, multiple tables
我在使用 MS Access 来获取多个表上的正确计数时遇到问题。 我根本不是 SQL 请求方面的专家。
我有一组表格,其结构如下:
每个 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.