为什么COUNT(*)会在有多个表时将结果相乘?

时间:2015-01-22 18:56:34

标签: sql

我有这个:

SELECT 
    COUNT(*)
FROM
    TABLE1,
    TABLE2,
    TABLE3;

Say TABLE1有5个条目,TABLE2有5个条目,TABLE3有1个,COUNT(*)基本上变成5 * 5 * 1 = 25.这有什么原因吗?理想情况下,我希望所有3个表中的总行数不必使用多个from语句。

3 个答案:

答案 0 :(得分:3)

SELECT 
    COUNT(*)
FROM
    TABLE1,
    TABLE2,
    TABLE3;

执行CROSS JOIN。它将TABLE1中的每条记录与TABLE2中的每条记录进行匹配,然后将搜索结果与TABLE3中的每条记录进行匹配,例如,如果TABLE1包含2条记录,{{1包含3条记录,TABLE2包含4条记录,您的结果会得到TABLE4

要从每个表中获取计数,您需要使用子查询:

2 X 3 X 4 = 24

OR

SELECT 
    (SELECT COUNT(*) FROM TABLE1),
    (SELECT COUNT(*) FROM TABLE2),
    (SELECT COUNT(*) FROM TABLE3);

将结果作为记录而不是列

答案 1 :(得分:2)

原因是你正在加入(交叉加入),是关于学校的集合理论,如果你想要计算3个不同的表然后总结一起计算,你可以这样做:

SELECT
SUM(COUNT)
FROM 
(SELECT COUNT(*) AS COUNT FROM TABLE1
UNION ALL
SELECT COUNT(*) AS COUNT FROM TABLE2
UNION ALL
SELECT COUNT(*) AS COUNT FROM TABLE3
) TB

答案 2 :(得分:1)

基本上你的计数是在计算每一个结果。你的选择是找到:

table1result1 table2result1 table3result1
table1result1 table2result2 table3result1
table1result1 table2result3 table3result1
table1result1 table2result4 table3result1
table1result1 table2result5 table3result1
table1result2 table2result1 table3result1
table1result2 table2result2 table3result1
table1result2 table2result3 table3result1
table1result2 table2result4 table3result1
table1result2 table2result5 table3result1
table1result3 table2result1 table3result1
table1result3 table2result2 table3result1
table1result3 table2result3 table3result1
table1result3 table2result4 table3result1
table1result3 table2result5 table3result1
table1result4 table2result1 table3result1
table1result4 table2result2 table3result1
table1result4 table2result3 table3result1
table1result4 table2result4 table3result1
table1result4 table2result5 table3result1
table1result5 table2result1 table3result1
table1result5 table2result2 table3result1
table1result5 table2result3 table3result1
table1result5 table2result4 table3result1
table1result5 table2result5 table3result1

如果算上是25个结果。原因是,正如Siyual在评论中所说,你的加入。当您设置一个没有任何条件的连接来限制它返回的结果时,它将返回连接表之间的每个可能的记录组合,因为您没有告诉它。