所以我有一个链接到记录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]
有没有更好的解决方案?在运行几十万条记录时,不会崩溃我的服务器?
答案 0 :(得分:9)
看起来好像有两个要求:
第一个比第二个容易得多。这里有一些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()