我试图找到一种基于混合列重复的行。这是我有什么的示例:

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]

但总体而言,我显然缺少这是为什么不工作,这意味着我可能做错事的理解。可能有人点我在正确的方向?

有帮助吗?

解决方案

不加入上的不等式;似乎JOIN和WHERE条件被反转。

SELECT t1.id
FROM Test t1
INNER JOIN Test t2
ON ((t1.test1 = t2.test2) OR (t1.test2 = t2.test1))
WHERE t1.id <> t2.id

应该很好地工作。

其他提示

您只有在选择他们找回这两个ID:

SELECT [LEFT].[ID], [RIGHT].[ID] 
FROM [TEST] AS [LEFT] 
   INNER JOIN [TEST] AS [RIGHT] 
   ON [LEFT].[ID] != [RIGHT].[ID] 
WHERE [LEFT].[TEST1] = [RIGHT].[TEST2]

这只能得到一排中的原因是,只有一个行(即行#2)具有TEST1等于另一行的TEST2。

我看起来像你的工作朝着 Cartiesian很快加入。一般来说,如果你正在寻找返回重复,你需要运行是这样的:

SELECT [LEFT].*
FROM [TEST]  AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
    ON [LEFT].[test1] = [RIGHT].[test1]
        AND [LEFT].[test2] = [RIGHT].[test2]
        AND [LEFT].[id] <> [RIGHT].[id]

如果你需要混合列,再搭配所需要的条件,但确实是这样的:

SELECT [LEFT].*
FROM [TEST] AS [LEFT]
INNER JOIN [TEST] AS [RIGHT]
    ON (
        [LEFT].[test1] = [RIGHT].[test2]
            OR [LEFT].[test2] = [RIGHT].[test1]
       )
        AND [LEFT].[id] <> [RIGHT].[id]

利用这一点,你比较合适的左侧和左在每个加盟权,省去了WHERE完全的需要。

不过,这种风格的查询执行时间呈指数增长针对插入到表的每一行,因为你每行比较每一行。

这可以从内部进行连接,如果我没有弄错。 这是我第一次回答mysql的各种问题,但我只是回答到这里得到在计算器上更多的积分。 使得MySQL不抱怨逗号是非常重要的。

SELECT [LEFT].[ID] FROM [TEST] AS [LEFT], [TEST] AS [RIGHT] 
WHERE [LEFT].[ID] != [RIGHT].[ID] 
AND [LEFT].[TEST1] = [RIGHT].[TEST2];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top