【问题标题】:SQL Select: Get rows where two or more columns are the sameSQL Select:获取两列或多列相同的行
【发布时间】:2013-01-03 23:19:29
【问题描述】:

我已经有一段时间不用处理 SQL 查询了,看起来很简单的查询让我发疯了。我有一个交易表,我试图根据各种标准从中选择重复。相关表结构如下:

[Transaction]
* ID          int
  Transacted  datetime
  Name        nvarchar(50)
  Description nvarchar(4000)
  size        bigint

从这个表中,我需要找到名称/大小的重复项,并报告名称具有相同大小事务的所有记录,即使日期和描述不同。我可以通过以下名称获得计数:

SELECT   Name, COUNT(Name) AS Count
FROM     Transaction
GROUP BY Name

然后我可以对其进行内部连接以获取其余数据:

SELECT data.ID, data.Transacted, data.Name, data.Description, data.Size, counts.Count
FROM (SELECT  Name, COUNT(Name) AS Count
      FROM  Transaction
      GROUP BY Name) AS counts 
INNER JOIN Transaction AS data ON counts.Name = data.Name
WHERE     (counts.Count > 1)
ORDER BY  data.Name, data.Transacted

但显然这只是给我重复名称的交易——而不是重复名称和大小的地方。

我正在寻求帮助来完成这篇文章,以便我报告所有数据,其中行显示相同名称和相同大小的重复。我可以轻松地将两列中的数据合并为一个结果并与之进行比较,但我不确定这是最佳方法。

提前致谢。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    问题中的代码表明您还需要额外的列。要返回所有重复 Name, size 的行,您可以使用

    WITH CTE
         AS (SELECT *,
                    COUNT(*) OVER (PARTITION BY Name, size) AS Cnt
             FROM   [Transaction])
    SELECT ID,
           Transacted,
           Name,
           Description,
           size
    FROM   CTE
    WHERE  Cnt > 1 
    

    【讨论】:

    • 这很好用,即使我收到不支持 OVER 的错误。这似乎只是一个 SQL 设计器问题。我得到了正确的结果。非常感谢您的帮助!
    • @tobint - 是的,视觉设计师不喜欢一些较新的语法。
    【解决方案2】:

    改成

    SELECT   Name, Size, COUNT(Name) AS Count
    FROM     Transaction
    GROUP BY Name, Size Having COUNT(Name) > 1
    

    【讨论】:

    • 我知道我忘记了一些简单的事情。自从我接触到 SQL 查询工具已经有好几年了。 :) 也就是说,我仍然无法返回这些行的其余数据。这将返回名称和计数,但我无法确定这些是哪些特定行(基于 ID)。如果我使用它作为子查询进行内部连接,但加入文件名,我仍然会返回文件名相同但大小不同的行。
    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 2014-03-07
    • 2019-10-07
    • 2020-09-06
    • 2021-02-11
    • 2021-02-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多