【问题标题】:I can't figure out how to do this DISTINCT我无法弄清楚如何做到这一点 DISTINCT
【发布时间】:2020-12-19 12:53:48
【问题描述】:

早安

我试图并试图理解为什么这个查询在 Group By 上给出了通常的错误。我想找到重复的行并删除它们。我在 Microsoft 的 MSDN 上找到了这个查询,但尽管如此,它仍然在 Group By 上给我这个错误。 主表有3个字段“Id,Item,Description”,表名是“tlbDescription”,这个查询理论上应该创建一个名为“duplicate_table”的表,在“duplicate_table”中插入重复值,然后从表中删除值“tlbDescription”,最后删除表“duplicate_table”。 如果有人可以帮我一把 谢谢 法布里齐奥 这是查询:

SELECT DISTINCT *
INTO duplicate_table
FROM [tlbDescrizione]
GROUP BY [Articolo]
HAVING COUNT([Articolo]) > 1

DELETE [tlbDescrizione]
WHERE [Articolo]  IN (SELECT [Articolo] FROM duplicate_table)

INSERT [tlbDescrizione] 
SELECT * FROM duplicate_table

DROP TABLE duplicate_table

【问题讨论】:

  • 您是否在每个查询的末尾尝试过分号?您的问题以单数形式提到“查询”,但您的代码有四个语句。
  • 您使用的是哪个 DBMS?您的第一个查询没有意义。您可以合法地按Articolo 分组并选择所有列的唯一方法是如果Articolo 是主键,但它是主键,那么GROUP BYDISTINCT 都是多余的。

标签: sql select distinct


【解决方案1】:

这个查询没有意义:

SELECT DISTINCT *
INTO duplicate_table
FROM [tlbDescrizione]
GROUP BY [Articolo]
HAVING COUNT([Articolo]) > 1;

由于GROUP BY,它正在选择所有列,但它是一个聚合查询。因此,SELECT 列与 GROUP BY 列不一致,您会收到错误。

如果你想要所有的列,那么你可以使用窗口函数:

SELECT DISTINCT *
INTO duplicate_table
FROM (SELECT d.*, COUNT(*) OVER (PARTITION BY d.Articolo) as cnt
      FROM tlbDescrizione d
     ) d
WHERE cnt > 1;

或者,如果你只想要 id:

SELECT Articolo
INTO duplicate_table
FROM tlbDescrizione
GROUP BY [Articolo]
HAVING COUNT(*) > 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多