【问题标题】:MSSQL group by all columnsMSSQL 按所有列分组
【发布时间】:2014-10-24 20:38:32
【问题描述】:

我需要的是 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 字符串会更容易。所以我仍在寻找一种通过一个查询来解决这个问题的方法。

【问题讨论】:

  • 如果将 * 替换为所有表列,它将起作用。我没明白你的问题?描述所有列?
  • 没错。我事先并不知道所有的专栏。我编辑了这个问题。正如我所说,查询子查询中的所有列并作为字符串连接是行不通的。
  • 您需要担心多少张表以及它需要多久运行一次?听起来像是一次性练习,那么为什么不硬着头皮写一堆 SELECT... 语句呢?
  • 这是一个数据质量分析工具,每周运行几次。每次都在一个新的数据集上,所以它必须是通用的。我可以将其拆分为两个查询,而不是上面提到的子查询,但是在我的任何其他 ~140 个查询中都没有这种开销。在我看来,这些要复杂得多。
  • 我看不到没有动态 SQL 或外部代码的方法来实现这一点。您真的需要知道计数还是只是想删除重复项?

标签: sql-server


【解决方案1】:

您可以使用动态 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'

【讨论】:

  • 这是我在评论中的问题的答案,所以 +1 (只要我得到 15 个代表)。但这不是我在这种情况下想要的,因为在我的外部代码中这样做会更容易。因此,我将问题标记为未回答,并希望通过一个查询得到解决问题的答案。
  • 在什么情况下不回答问题?
  • 它实际上确实按照我提出的方式回答了它。但是使用动态 sql 做任何事情都比在我的外部代码中做更复杂。所以我的问题必须更具体。
  • 我很确定 (99%) 除非您明确编写所有 ~140 个查询,否则您只能使用动态 SQL 做您想做的事。
  • 您的意思是我工具中的 140 个查询?查询与更多信息(描述等)一起存储在表中,由工具和用户使用参数化的准备好的语句进行操作,然后执行。没有动态sql,虽然它可能更容易,我不知道。这就是它一直以来的方式。
猜你喜欢
  • 2016-07-28
  • 2022-10-08
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多