样本数据
DECLARE @Dependencies TABLE
([ID] int, [parent] varchar(50), [dependent] varchar(50), [relationship] varchar(50));
INSERT INTO @Dependencies
([ID], [parent], [dependent], [relationship])
VALUES
(1234, 'John', 'Mike', 'Parent'),
(1235, 'Mike', 'John', 'Child'),
(1236, 'Nancy', 'John', 'Spouse'),
(1237, 'John', 'Nancy', 'Spouse'),
(1238, 'Peter', 'Mike', 'Sibling'),
(1239, 'Mike', 'Peter', 'Sibling');
查询
计算(parent, dependent) 中的MIN 和MAX,然后您可以将它们组合在一起。
SELECT
ID
,CASE WHEN [parent] < [dependent] THEN [parent] ELSE [dependent] END AS MinRelationship
,CASE WHEN [parent] > [dependent] THEN [parent] ELSE [dependent] END AS MaxRelationship
,[relationship]
FROM @Dependencies
;
结果
+------+-----------------+-----------------+--------------+
| ID | MinRelationship | MaxRelationship | relationship |
+------+-----------------+-----------------+--------------+
| 1234 | John | Mike | Parent |
| 1235 | John | Mike | Child |
| 1236 | John | Nancy | Spouse |
| 1237 | John | Nancy | Spouse |
| 1238 | Mike | Peter | Sibling |
| 1239 | Mike | Peter | Sibling |
+------+-----------------+-----------------+--------------+
其余的取决于您要从每对中选择哪一行。例如,我们可能希望选择ID 最小的行。 CTE_MinMax 是上面的简单查询。 CTE_rn 将一个数字添加到由该对分区并按 ID 排序的每一行。最后的SELECT 每对只返回一行。
如果只有一个条目(不是一对),或者有两个以上的条目,查询将正常工作。
WITH
CTE_MinMax
AS
(
SELECT
ID
,CASE WHEN [parent] < [dependent] THEN [parent] ELSE [dependent] END AS MinRelationship
,CASE WHEN [parent] > [dependent] THEN [parent] ELSE [dependent] END AS MaxRelationship
,[relationship]
FROM @Dependencies
)
,CTE_rn
AS
(
SELECT
ID
,MinRelationship
,MaxRelationship
,relationship
,ROW_NUMBER() OVER (PARTITION BY MinRelationship, MaxRelationship ORDER BY ID) AS rn
FROM CTE_MinMax
)
SELECT
ID
,MinRelationship
,MaxRelationship
,relationship
FROM CTE_rn
WHERE rn = 1
;
结果
+------+-----------------+-----------------+--------------+
| ID | MinRelationship | MaxRelationship | relationship |
+------+-----------------+-----------------+--------------+
| 1234 | John | Mike | Parent |
| 1236 | John | Nancy | Spouse |
| 1238 | Mike | Peter | Sibling |
+------+-----------------+-----------------+--------------+