因此,我有一个与记录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]
有没有什么解决方案能更好地工作?就像在运行几十万条记录时不会使我的服务器崩溃一样?
5条答案
按热度按时间zzzyeukh1#
看起来你有两个要求:
1.确定具有多个记录ID的所有别名,以及
1.水平列出这些别名的记录ID。
第一种方法比第二种方法简单得多。下面是一些SQL语句,它们应该可以帮助您实现第一种方法:
至于第二个问题,如果你对表格中的数据满意:
......你可以就此打住。否则,事情就变得棘手了。
PIVOT命令 * 不 * 一定会帮助您,因为它试图解决的问题与您所面临的问题不同。
我假设您不一定能预测每个
Alias
有多少个重复的Record ID
值,因此不知道需要多少列。如果您只有两个记录,那么在一列中显示每个记录就变得相对简单了。如果您有更多的记录,我建议您考虑一下这些记录的目标(报表、网页、Excel)在水平显示这些记录方面是否比SQL Server在水平返回这些记录方面做得更好。
eqfvzcg82#
也许您需要的只是
RecordId
的min()
和max()
:您也可以使用
count(distinct)
来计算相异值的数目:0s0u357o3#
这将给予所有重复的值:
qvk1mo1f4#
我同意Ann L的回答,但我想说明一下如何使用CTE的窗口函数,因为您可能更喜欢可读性。
(Re:如何水平地枢转,我再次同意安)
第一个
第一个CTE获取所有唯一别名/记录ID组合。
第二个CTE只是为上面的别名创建一个新列,并为每个别名添加记录ID的计数。这允许您只筛选那些有多个记录ID与之关联的别名。
8fq7wneg5#