【发布时间】:2015-09-09 15:34:23
【问题描述】:
互联网!我对 SQL 很陌生,我需要在某些字段中获取所有具有重复信息的行,并让它们显示在其他重复项旁边(按重复项分组)。
例如,假设我有一个带有列的表:
A,B,C,D,E,F,G
我希望能够获取 B、C、D 和 E 与另一个条目共享相同值的所有条目(整行),并在原始条目旁边显示重复项。 我已经有了解决方案,但效率极低。我正在努力改善我的跑步时间。
我原来的解决方案是这样的:
SELECT TOP 1000
A,
B,
C,
D,
E,
F,
G
FROM tbl_myTable
WHERE (B+C+D+E+F+G) IN (
SELECT
B+C+D+E+F+G
FROM
tbl_myTable
GROUP BY
B,C,D,E,F,G
HAVING COUNT(*) > 1
)
ORDER BY B,C,D,E,F,G ASC
这给了我想要的结果,但速度非常慢(运行时间超过 15 分钟)。我使用临时表重新设计了我的解决方案,并使用此脚本将运行时间缩短到 5 分钟:
--Drop the temp table if it exists.
IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL
DROP TABLE #Temp1
SELECT
B+C+D+E+F+G AS CompareString
INTO #Temp1
FROM tbl_myTable
GROUP BY
B,C,D,E,F,G
HAVING COUNT(*) > 1
SELECT TOP 1000
A,
B,
C,
D,
E,
F,
G
FROM tbl_myTable
WHERE (B+C+D+E+F+G) IN (
SELECT * FROM #Temp1
)
ORDER BY B,C,D,E,F,G ASC
五分钟似乎仍然很长。有没有更快的方法来做到这一点?我是 SQL 新手,所以如果我做的不好,请告诉我!谢谢!
【问题讨论】:
-
谷歌并了解 EXISTS() 函数。
标签: sql-server database performance count duplicates