0

我在表中有两列,例如:

ID1,ID2
1,2
3,4
4,5
7,8
8,10
9,10
9,11
11,12
..,..

所以,我想将这些 ID 关联到同一个组中,如下所示:

ID Group_ID
1,1
2,1
3,2
4,2
5,2
7,3
8,3
9,3
10,3
11,3
12,3
..,..

PS:在这些示例中,3 等于 4,4 等于 5,因此 4 应该等于 5。此外,7、8、9、10、11、12 应该是相同的组 ID。我正在尝试这样做,如果 A=B 和 B=C,那么 A 应该等于 C(A=C)。

4

1 回答 1

0

不漂亮,但这可以使用常规 SQL:

SELECT * FROM
(SELECT ID1 AS ID, Group_ID
 FROM
 (SELECT t1.ID1 AS ID1,
         t1.ID2 AS ID2,
         t2.ID1 AS ID3,
         t2.ID2 AS ID4,
         (SELECT COUNT(*) + 1
          FROM ids t3
          LEFT JOIN ids t4
          ON t3.ID2 = t4.ID1
          OR (t3.ID1 = t4.ID1 AND t3.ID2 <> t4.ID2)
          OR (t3.ID2 = t4.ID2 AND t3.ID1 <> t4.ID1)
          WHERE (t3.ID1 < t1.ID1 
                 OR (t3.ID1 = t1.ID1 AND t3.ID2 < t1.ID2))
          AND t4.ID1 IS NULL) AS Group_ID
  FROM ids t1
  LEFT JOIN ids t2
  ON t1.ID2 = t2.ID1
  OR (t1.ID1 = t2.ID1 AND t1.ID2 <> t2.ID2)
  OR (t1.ID2 = t2.ID2 AND t1.ID1 <> t2.ID1)) sub1
 UNION DISTINCT
 SELECT ID2 AS ID, Group_ID
 FROM
 (SELECT t1.ID1 AS ID1,
         t1.ID2 AS ID2,
         t2.ID1 AS ID3,
         t2.ID2 AS ID4,
         (SELECT COUNT(*) + 1
          FROM ids t3
          LEFT JOIN ids t4
          ON t3.ID2 = t4.ID1
          OR (t3.ID1 = t4.ID1 AND t3.ID2 <> t4.ID2)
          OR (t3.ID2 = t4.ID2 AND t3.ID1 <> t4.ID1)
          WHERE (t3.ID1 < t1.ID1 
                 OR (t3.ID1 = t1.ID1 AND t3.ID2 < t1.ID2))
          AND t4.ID1 IS NULL) AS Group_ID
  FROM ids t1
  LEFT JOIN ids t2
  ON t1.ID2 = t2.ID1
  OR (t1.ID1 = t2.ID1 AND t1.ID2 <> t2.ID2)
  OR (t1.ID2 = t2.ID2 AND t1.ID1 <> t2.ID1)) sub2
) sub3
ORDER BY ID

请参阅SQL Fiddle 演示

于 2013-08-18T13:57:47.850 回答