下面你會發現SQL代碼與插入的數據
CREATE TABLE TEST (A varchar(4), B varchar(4));
INSERT INTO TEST (ID,A,B) VALUES ('1','d','a');
INSERT INTO TEST (ID,A,B) VALUES ('1','c','a');
INSERT INTO TEST (ID,A,B) VALUES ('1','b','a');
INSERT INTO TEST (ID,A,B) VALUES ('1','a','xxx');
INSERT INTO TEST (ID,A,B) VALUES ('1','a','d');
INSERT INTO TEST (ID,A,B) VALUES ('1','a','c');
INSERT INTO TEST (ID,A,B) VALUES ('1','a','b');
INSERT INTO TEST (ID,A,B) VALUES ('2','g','a');
INSERT INTO TEST (ID,A,B) VALUES ('2','a','g');
INSERT INTO TEST (ID,A,B) VALUES ('3','f','b');
INSERT INTO TEST (ID,A,B) VALUES ('3','b','f');
INSERT INTO TEST (ID,A,B) VALUES ('4','s','r');
INSERT INTO TEST (ID,A,B) VALUES ('4','r','s');
INSERT INTO TEST (ID,A,B) VALUES ('5','r','t');
INSERT INTO TEST (ID,A,B) VALUES ('7','h','g');
一起創建我的表如前文所述,使用此查詢:
select distinct tab1.ID,
(case when tab1.A < tab1.B then tab1.A else tab1.B end) as A,
(case when tab1.A > tab1.B then tab1.A else tab1.B end) as B
from TEST tab1, TEST tab2
...我得到所需的結果:
ID A B
-- -- --
1 a b
1 a c
1 a d
1 a xxx
2 a g
3 b f
4 r s
5 r t
7 g h
對不起你們,也許我在這裏索姆錯過事情,但似乎你的解決方案仍然無法按預期工作。
@fthiella:我測試您的解決方案:
SELECT tab1.*
FROM TEST tab1 LEFT JOIN TEST tab2 on tab1.B=tab2.A
WHERE tab1.A<tab1.B OR tab2.A is null
結果(a/b
重複,缺失g/h
):
ID A B
-- -- --
1 a b
1 a b
1 a c
1 a xxx
2 a g
3 b f
4 r s
5 r t
@wildplasser:看來這個解決方案不起作用,太
SELECT * FROM TEST t
WHERE EXISTS (
SELECT * FROM TEST x
WHERE x.a = t.b AND x.b = t.a
AND x.a > x.b -- tie breaker
);
結果(a/xxx
和r/t
缺失):
ID A B
-- -- --
1 a b
1 a c
1 a d
2 a g
3 b f
4 r s
'b a'是'a b'的反向鏈接。而且'a''是'b a'的後面鏈接。你想如何選擇保留哪一個以及哪一個跳過? – fthiella
但是如何知道什麼是正確答案(訂單)?爲什麼不是b和n m或b a和n m? – Justin