在SQL中,在一列中查找具有另一列的唯一值的重复项

时间:2013-07-08 22:16:41

标签: sql sql-server

所以我有一个链接到记录ID的别名表。我需要找到具有唯一记录ID的重复别名。为了更好地解释:

ID    Alias     Record ID
1     000123    4
2     000123    4
3     000234    4
4     000123    6
5     000345    6
6     000345    7

对此表的查询结果应该是

的效果
000123    4    6
000345    6    7

表示记录4和6的别名均为000123,记录6和7的别名均为000345。

我正在考虑使用GROUP BY,但如果我按别名分组,那么我就无法选择记录ID,如果我按别名和记录ID分组,它将仅返回此示例中的前两行,其中两列都是重复的。我发现的唯一解决方案是崩溃我的服务器,它是对所有数据进行两种不同的选择,然后加入它们

ON [T_1].[ALIAS] = [T_2].[ALIAS] AND NOT [T_1].[RECORD_ID] = [T_2].[RECORD_ID]

有没有更好的解决方案?在运行几十万条记录时,不会崩溃我的服务器?

3 个答案:

答案 0 :(得分:9)

看起来好像有两个要求:

  1. 标识具有多个记录ID的所有别名
  2. 水平列出这些别名的记录ID。
  3. 第一个比第二个容易得多。这里有一些SQL应该可以通过第一个获得你想要的地方:

    WITH A   -- Get a list of unique combinations of Alias and [Record ID]
    AS  (
       SELECT Distinct
              Alias
         ,    [Record ID]
       FROM  T1
    )
    ,   B  -- Get a list of all those Alias values that have more than one [Record ID] associated
    AS  (
        SELECT Alias
        FROM   A
        GROUP BY
               Alias
        HAVING COUNT(*) > 1
    )
    SELECT  A.Alias
        ,   A.[Record ID]
    FROM    A
        JOIN B
            ON  A.Alias = B.Alias
    

    现在,至于第二个。如果您对此表单中的数据感到满意:

    Alias     Record ID
    000123    4
    000123    6
    000345    6
    000345    7
    

    ......你可以在那里停下来。否则,事情变得棘手。

    PIVOT命令必然会帮助你,因为它试图解决的问题不同于你所拥有的问题。

    我假设您无法预测每个Record ID有多少Alias个重复值,因此不知道您需要多少列。如果你只有两个,那么在列中显示它们就变成了一个相对简单的练习。如果您有更多,我建议您考虑这些记录的目的地(报告?网页?Excel?)是否能够更好地水平显示它们,而不是SQL Server可以做的返回它们水平。

答案 1 :(得分:0)

也许你想要的只是min()的{​​{1}}和max()

RecordId

您还可以使用select Alias, min(RecordID), max(RecordId) from yourTable t group by Alias having min(RecordId) <> max(RecordId)

计算不同值的数量
count(distinct)

答案 2 :(得分:0)

这将给出所有重复的值:

setReadable()