对于这样的给定结构:
+----+----------+
| ID | Name |
+----+----------+
| a | ZZZZZZZZ |
| b | YYYYYYYY |
| c | WWWWWWWW |
| d | ZZZZZZZZ |
| e | YYYYYYYY |
| f | WWWWWWWW |
+----+----------+
获取具有相同名称的(ID,ID2)对列表,不包括(ID2,ID)具有对应(ID,ID2)的所有记录。
+----+----------+-----+
| ID | Name | ID2 |
+----+----------+-----+
| a | ZZZZZZZZ | d |
| b | YYYYYYYY | e |
| c | WWWWWWWW | f |
+----+----------+-----+
我找到了这个解决方案,但我想知道是否有更“学术”的解决方案。
;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;
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');
1 个回答