所有列的MSSQL组

时间:2014-10-23 11:50:09

标签: sql-server

我需要的是像select * from table group by * having count(*) > 1这样的东西,它不适用于mssql2008r2和postgresql。该查询每周在不同的表上运行几次。问题基本上是before

因为在有DISTINCT的时候,为什么有人会需要这个时候一直存在混淆:我需要查询以便在没有主键的表中识别相同的行。我知道这不是常规案例,但这正是我记录和报告的必要条件。

通过返回所有表列并格式化为字符串的子查询进行分组不起作用:

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

返回错误信息。 144。

编辑:编写查询时我不知道列名。所以我需要一个通用查询而不指定列名。

EDIT2:建议的动态sql代码工作正常,但不适合我的情况,因为在我的外部代码中创建GROUP BY String会更容易。所以我仍在寻找一种方法来解决这个问题。

1 个答案:

答案 0 :(得分: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'