2015-01-22 2 views
0

Я получил это:Почему COUNT (*) умножает результаты при наличии нескольких таблиц?

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

Say TABLE1 имеет 5 записей, TABLE2 имеет 5 записей, и Table3 имеет один, COUNT (*), по существу становится 5 * 5 * 1 = 25. Есть ли причина это? В идеале, я хочу, чтобы суммарный ряд строк из всех трех таблиц не должен был использовать несколько из операторов.

+1

Посмотрите определение CROSS JOIN – Mihai

+0

Посмотрите, что 'select * from table1, table2, table3' делает – njzk2

+1

Поскольку вы делаете декартовое соединение между всеми тремя таблицами, что приводит к любой возможной комбинации значений между тремя , – Siyual

ответ

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

делает a CROSS JOIN. Он соответствует каждой записи в TABLE1 с каждой записью в TABLE2, затем сопоставляет Eash результата с каждой записью в TABLE3, так, например, если TABLE1 содержит 2 записи, TABLE2 содержал 3 записи и TABLE4 содержал 4 записи, вы получите 2 X 3 X 4 = 24 в качестве результата.

Чтобы получить отсчеты из каждой таблицы вы должны будете использовать подзапросы:

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

ИЛИ

SELECT COUNT(*) FROM TABLE1 
UNION ALL 
SELECT COUNT(*) FROM TABLE2 
UNION ALL 
SELECT COUNT(*) FROM TABLE3 

, чтобы получить результат в виде записей вместо столбцов

+0

Интересно, если его запрос * «Я хочу, чтобы суммарный ряд строк из всех трех таблиц без необходимости использовать несколько из операторов» * может быть выполнена без какого-либо странного кода TSQL. – Andrew

+0

проверить мой ответ, может быть, может вам помочь. –

2

Причина в том, вы делаете присоединение (cross join), это теория набора из школы, если вы хотите подсчитать 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 
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 результатов. Причина в том, что, как сказал Сиюаль в комментариях, ваши объединения. Когда вы настраиваете соединение без каких-либо условий для ограничения возвращаемых результатов, оно возвращает все возможные комбинации записей между объединенными таблицами, потому что вы этого не сказали.

+0

этот пост, имеет объяснение с данными предварительного просмотра, но не имеет решения его проблемы. –

+0

Его вопрос: «Есть ли причина для этого?» На это я и решил ответить. – Jake

+0

, а затем он говорит: «В идеале, я хочу, чтобы итоговый ряд строк из всех трех таблиц», просто комментарий. –

Смежные вопросы