【发布时间】:2010-12-25 19:31:44
【问题描述】:
我正在尝试根据混合列查找重复行。这是我所拥有的一个例子:
CREATE TABLE Test
(
id INT PRIMARY KEY,
test1 varchar(124),
test2 varchar(124)
)
INSERT INTO TEST ( id, test1, test2 ) VALUES ( 1, 'A', 'B' )
INSERT INTO TEST ( id, test1, test2 ) VALUES ( 2, 'B', 'C' )
现在如果我运行这个查询:
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
我希望取回两个 ID。 (1 和 2),但是我只拿回一排。
我的想法是它应该比较每一行,但我想这不正确? 为了解决这个问题,我将查询更改为:
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
OR [LEFT].[TEST2] = [RIGHT].[TEST1]
这给了我两行,但是根据行数,性能下降得非常快。
我为性能和结果提出的最终解决方案是使用联合:
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]
UNION
SELECT [LEFT].[ID]
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
ON [LEFT].[ID] != [RIGHT].[ID]
WHERE [LEFT].[TEST2] = [RIGHT].[TEST1]
但总的来说,我显然不明白为什么这不起作用,这意味着我可能做错了什么。有人能指出我正确的方向吗?
【问题讨论】:
-
尝试使用以下数据进行第一个查询: INSERT INTO TEST ( id, test1, test2 ) VALUES ( 1, 'C', 'B' ) INSERT INTO TEST ( id, test1, test2 ) VALUES ( 2, 'B', 'C' ) 那应该给你两行。