2014-10-23 4 views
1

Мне нужно что-то вроде select * from table group by * having count(*) > 1, который не работает на mssql2008r2 и postgresql. Запрос выполняется несколько раз в неделю в разных таблицах. Вопрос в основном был поставлен before.Группа MSSQL по всем столбцам

Потому что возникла путаница в том, почему кому-то когда-либо понадобится это, когда есть DISTINCT: мне нужен запрос, чтобы идентифицировать идентичные строки в таблице без первичного ключа. Я знаю, что это не обычный случай, но это именно то, что у меня есть для документ и отчет.

Группировка по подзапроса, который возвращает все столбцы таблицы и форматируется как строка не работает:

select * from table group by (select column_name + ', ' as data() from information_schema.columns where table_name = 'table' for xml path(''))

Возврат ошибки Сообщ. 144.

EDIT: При написании запроса я не знаю названия столбцов. Поэтому мне нужен общий запрос без указания имен столбцов.

EDIT2: Предлагаемый динамический код sql отлично работает, но не подходит для моего случая, так как было бы проще создать GROUP BY String в моем внешнем коде. Поэтому я все еще ищу способ решить эту проблему одним запросом.

+0

Если вы замените * всеми столбцами таблицы, это сработает. У меня не было проблемы? Описание всех столбцов? – gustavodidomenico

+0

Точно. Я не знаю всех столбцов заранее. Я редактировал вопрос. И, как я сказал, запрос всех столбцов в подзапросе и конкатенирование в виде строки не работает. – Juergen

+0

Сколько таблиц вам нужно беспокоиться и как часто это нужно выполнять? Звучит как одноразовое упражнение, так почему бы просто не укусить пулю и написать кучу SELECT ... заявлений? – DavidG

ответ

2

Вы можете сделать это с помощью динамического SQL. Вот пример, завернутые в хранимой процедуре:

CREATE PROCEDURE GetDistinctRowsWithCount 
(
    @table VARCHAR(255) 
) 

AS 

DECLARE @columns VARCHAR(8000) = '' 

SELECT @columns = @columns + '[' + name + ']' + ',' 
FROM sys.columns 
WHERE object_id = OBJECT_ID(@table) 

DECLARE @sql NVARCHAR(MAX) = 'SELECT ' + @columns + 'COUNT(*) FROM ' + @table + ' GROUP BY ' + LEFT(@columns, LEN(@columns)-1) 

EXEC sp_executesql @sql 

Или, если вы предпочитаете видеть только дублированные строки:

CREATE PROCEDURE GetDuplicateRowsWithCount 
(
    @table VARCHAR(255) 
) 

AS 

DECLARE @columns VARCHAR(8000) = '' 

SELECT @columns = @columns + '[' + name + ']' + ',' 
FROM sys.columns 
WHERE object_id = OBJECT_ID(@table) 

DECLARE @sql NVARCHAR(MAX) = 'SELECT ' + @columns + 'COUNT(*) FROM ' + @table + ' GROUP BY ' + LEFT(@columns, LEN(@columns)-1) + ' HAVING COUNT(*) > 1' 

EXEC sp_executesql @sql 

А для вызова процедуры, просто передать имя таблицы:

EXEC dbo.GetDistinctRowsWithCount 'table' 
+0

Это ответ на мой вопрос в комментарии, так что +1 за это (как только я получил 15 повторов). Но это не то, что я хочу в этом случае, поскольку это было бы легче сделать в моем внешнем коде. Поэтому я оставляю вопрос отмеченным как безответный и надежду на ответы для решения проблемы с одним запросом. – Juergen

+0

Как он не отвечает на вопрос? – DavidG

+0

На самом деле он отвечает на него так, как я его представлял. Но делать что-либо, используя динамический sql, сложнее, чем в моем внешнем коде. Поэтому я должен быть более конкретным в моем вопросе. – Juergen

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