3

所以我有一个链接到记录 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]

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

4

3 回答 3

11

看起来你有两个要求:

  1. 识别具有多个记录 id 的所有别名,以及
  2. 水平列出这些别名的记录 ID。

第一个比第二个容易得多。这里有一些 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 在返回它们方面做得更好水平。

于 2013-07-08T22:39:21.857 回答
0

也许你想要的只是min()and max()of RecordId

select Alias, min(RecordID), max(RecordId)
from yourTable t
group by Alias
having min(RecordId) <> max(RecordId)

您还可以使用以下方法计算不同值的数量count(distinct)

select Alias, count(distinct RecordId) as NumRecordIds, min(RecordID), max(RecordId)
from yourTable t
group by Alias
having count(DISTINCT RecordID) > 1;
于 2013-07-08T23:00:58.807 回答
0

这将给出所有重复的值:

select Alias, count(RecordId) as NumRecordIds,  
from yourTable t
group by Alias
having count(RecordId) <> count(distinct RecordId);
于 2015-06-16T10:13:26.900 回答