我需要的是像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会更容易。所以我仍在寻找一种方法来解决这个问题。
答案 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'