Выбор суммы подсчета из таблиц в БД - PullRequest
3 голосов
/ 13 июля 2011

У меня следующий запрос:

SELECT SUM(count) 
  FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
        UNION
        SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
        UNION
        SELECT 'track' AS table_name, COUNT(*) as count FROM track)

Он работает как положено и возвращает правильный счет.Но теперь, когда я делаю следующий запрос, я получаю неправильный счет:

SELECT SUM(count) 
  FROM (SELECT COUNT(*) as count FROM artist
        UNION
        SELECT COUNT(*) as count FROM persons
        UNION
        SELECT COUNT(*) as count FROM track)

Почему первый запрос получает правильный счет, а второй - нет?

Ответы [ 3 ]

11 голосов
/ 13 июля 2011

UNION исключает повторяющиеся значения, поэтому, если два числа оказываются одинаковыми, одно исключается и суммируется только одно.Попробуйте использовать UNION ALL вместо.

SELECT sum(count) FROM
(SELECT COUNT(*) as count FROM artist
UNION ALL
SELECT COUNT(*) as count FROM persons
UNION ALL
SELECT COUNT(*) as count FROM track)
1 голос
/ 13 июля 2011

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

SELECT
   Total_Rows= SUM(st.row_count)
FROM
   sys.dm_db_partition_stats st
WHERE
   (index_id < 2) --cover both heaps and clustered indexes
   AND
   OBJECT_SCHEMA_NAME (object_id) <> 'sys' --ignore system stuff

Это будет выполнено в мгновение ока

Принимая ваш оригинал, вы можете получить счет за таблицу и в целомза один раз ..

SELECT
    *,
    SUM(count) OVER () AS GrandTotal
FROM (SELECT 'artist' AS table_name, COUNT(*) as count FROM artist
    UNION
    SELECT 'persons' AS table_name, COUNT(*) as count FROM persons
    UNION
    SELECT 'track' AS table_name, COUNT(*) as count FROM track)
0 голосов
/ 13 июля 2011

Как это неточно? Одним из способов может быть то, что во втором запросе вы набираете UNION, а две или более строки содержат одно и то же значение, поскольку UNION удаляет повторяющиеся значения. Попробуйте это с UNION ALL, который возвращает все строки, а не только уникальные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...