选择对 (a,b) 排除 (b,a) 具有相同的值

McN*_*ets 7 sql-server

对于这样的给定结构:

+----+----------+
| ID |   Name   |
+----+----------+
| a  | ZZZZZZZZ |
| b  | YYYYYYYY |
| c  | WWWWWWWW |
| d  | ZZZZZZZZ |
| e  | YYYYYYYY |
| f  | WWWWWWWW |
+----+----------+
Run Code Online (Sandbox Code Playgroud)

获取具有相同名称的对 (ID, ID2) 的列表,排除 (ID2, ID) 具有对应 (ID, ID2) 的所有记录。

+----+----------+-----+
| ID |   Name   | ID2 |
+----+----------+-----+
| a  | ZZZZZZZZ |  d  |
| b  | YYYYYYYY |  e  |
| c  | WWWWWWWW |  f  |
+----+----------+-----+
Run Code Online (Sandbox Code Playgroud)

我找到了这个解决方案,但我想知道是否有更“学术”的解决方案。

;WITH Pair AS
(
SELECT
    CASE WHEN p1.Id > p2.Id THEN p2.Id ELSE p1.Id END as ID,
    CASE WHEN p1.Id > p2.Id THEN p1.Id ELSE p2.Id END as ID2,
    p1.Name
FROM Pairs p1
     LEFT JOIN Pairs p2
     ON p1.Name = p2.Name
     AND p1.Id <> p2.Id
)
SELECT DISTINCT ID, ID2, Name
FROM Pair;
Run Code Online (Sandbox Code Playgroud)

雷克斯特

CREATE TABLE Pairs(Id varchar(5), Name varchar(20));
INSERT INTO Pairs VALUES
('a','ZZZZZZZZ'),
('b','YYYYYYYY'),
('c','WWWWWWWW'),
('d','ZZZZZZZZ'),
('e','YYYYYYYY'),
('f','WWWWWWWW');
Run Code Online (Sandbox Code Playgroud)

Dav*_*itz 10

SELECT
    p1.Id,p2.Id,p1.Name 
FROM Pairs p1
     JOIN Pairs p2
     ON p1.Name = p2.Name
     AND p1.Id < p2.Id
Run Code Online (Sandbox Code Playgroud)