#sql #sql-server #count #distinct
#sql #sql-сервер #подсчет #distinct
Вопрос:
У меня есть запрос, который дает мне общее количество записей в каждой таблице базы данных:
SELECT QUOTENAME('MyDb') '.' QUOTENAME(SCHEMA_NAME([sOBJ].schema_id))
'.' QUOTENAME([sOBJ].[name]) AS [TableName], SUM([sPTN].[Rows]) AS [RowCount]
FROM [MyDB].[sys].[objects] AS [sOBJ]
INNER JOIN [sys].[partitions] AS [sPTN]
ON [sOBJ].object_id = [sPTN].object_id
WHERE [sOBJ].[type] = 'U'
AND [sOBJ].[is_ms_shipped] = 0x0
AND [index_id] < 2 -- 0:Heap, 1:Clustered
GROUP BY [sOBJ].schema_id, [sOBJ].[name]
Что я пытаюсь сделать, так это также получить количество отдельных записей для каждой таблицы в базе данных. Я пробовал использовать циклы While и CTE
s, но, похоже, не могу понять это правильно. Не уверен, что это правильная методология.
Заранее спасибо.
Комментарии:
1. различаются по всем столбцам для каждой таблицы? если у вас есть PK в каждой таблице, то каждая строка различна, я думаю, это не то, что вы можете сделать легко, вам нужно знать имена столбцов, которые определяют различие в каждой таблице
2. Вам нужна статистика индекса или статистика таблицы, но я не видел способа запросить их напрямую. Единственным верным способом было бы буквально выбрать distinct * для подсчета строк, и это довольно ужасно.
3. Спасибо вам обоим за ваш ответ, я тоже так думал, но не был уверен, что был прав.
4.
HAVING SUM([sPTN].[Rows]) = 1
? Или заменитьSUM
наCOUNT(*)
вSELECT
и использоватьHAVING COUNT(*) = 1
?