Подсчет отдельных строк без использования подзапроса - PullRequest
9 голосов
/ 19 февраля 2010

Скажем, у меня есть Table1, в котором есть повторяющиеся строки (забудьте о том, что у него нет первичного ключа ...) Можно ли переписать следующее без использования JOIN, подзапроса или CTE, а также без необходимости прописывать столбцычто-то вроде GROUP BY?

SELECT COUNT(*)
FROM (
    SELECT DISTINCT * FROM Table1
) T1

Ответы [ 4 ]

10 голосов
/ 20 февраля 2010

Вы можете сделать что-то вроде этого.

SELECT Count(DISTINCT ProductName) FROM Products

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

Если вы хотите сделать что-то, что вы предложили в вопросе, это будет означать, что у вас есть дубликаты записей в вашей таблице.

Если бы у вас не было повторяющихся записей, SELECT DISTINCT * from table было бы таким же без отличных.

8 голосов
/ 20 февраля 2010

Нет, это невозможно.

Если вы ограничены вашей структурой / инструментом запросов / чем-либо еще, не можете использовать подзапрос и не можете прописать каждое имя столбца в GROUP BY, значит вы СОЛ.

Если вы не ограничены вашим фреймворком / инструментом запросов / чем-то еще, то нет никакой причины не использовать подзапрос.

3 голосов
/ 19 февраля 2010

Если вы действительно хотите это сделать, вы можете просто «ВЫБЕРИТЕ СЧЕТЧИК (*) ИЗ таблицы1 ГРУППА ВСЕ, столбцы, здесь» и принять размер результирующего набора в качестве количества.

Но это был бы достойный ежедневный код;)

1 голос
/ 25 марта 2013

Я просто хотел уточнить ответ, сказав, что вам нужно проверить, сопоставим ли тип данных столбцов - в противном случае вы получите сообщение об ошибке, пытаясь сделать их ОТЛИЧНЫМИ:

например. com.microsoft.sqlserver.jdbc.SQLServerException: тип данных ntext не может быть выбран как DISTINCT, потому что он не сопоставим.

Это верно для больших двоичных файлов, столбцов xml и других, в зависимости от вашей СУБД - rtm. Например, решением для SQLServer является преобразование его из ntext в nvarchar (MAX) начиная с SQLServer 2005 и далее.

Если вы придерживаетесь столбцов PK, то все должно быть в порядке (я сам не проверял это, но я бы подумал, что столбцы PK должны быть сопоставимы)

...