我在使用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
中的一项在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
我们将不胜感激任何帮助。
答案 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的计数为空)。>
我认为可能会对其进行升级,但是现在它可以解决我的问题,并允许我添加所需数量的表。