我需要一个select命令来执行以下操作:
我有一张这样的表
ID | col1 | col2 | ...
23 | AAA | BBB | ...
23 | BBB | AAA | ...
59 | asf | 567 | ...
02 | XXX | ZZZ | ...
02 | YYY | XXX | ...
有时会有2行具有相同的ID。现在我想选择这些,它们在两个特定列(此处为col1,col2)中也具有相同的直径相邻条目,就像示例中的前两行一样。通过类比,这些具有相同的ID但不同的条目(见最后两行)。
作为示例的结果,我想要有两个表:
ID | col1 | col2 | ...
23 | AAA | BBB | ...
23 | BBB | AAA | ...
和
ID | col1 | col2 | ...
02 | XXX | ZZZ | ...
02 | YYY | XXX | ...
我尝试使用GROUP BY计算但是失败了
答案 0 :(得分:1)
SELECT t0.*
FROM test t0
JOIN test t1 ON ((t0.ID=t1.ID) AND
(t0.col1=t1.col2 AND t0.col2=t1.col1));
+----+------+------+
| ID | col1 | col2 |
+----+------+------+
| 23 | BBB | AAA |
| 23 | AAA | BBB |
+----+------+------+
SELECT t0.*
FROM test t0
JOIN test t1 ON (NOT (t0.col1=t1.col1 AND t0.col2=t1.col2) AND
(t0.ID=t1.ID) AND
(t0.col1<>t1.col2 OR t0.col2<>t1.col1));
+----+------+------+
| ID | col1 | col2 |
+----+------+------+
| 2 | YYY | XXX |
| 2 | XXX | ZZZ |
+----+------+------+
答案 1 :(得分:0)
你需要的是你的桌子的自我加入,使用做三件事的标准:
此查询执行此操作。
SELECT a.id, a.col1, a.col2
FROM tbl AS a
JOIN tbl AS b ON
( a.id=b.id
AND (a.col1 = b.col2 OR a.col2 = b.col1)
AND (a.col1 != b.col1 AND a.col2 != b.col2)
)
这是一个小提琴。 http://sqlfiddle.com/#!2/3cd08/2/0