1

我一直在思考这个问题,但找不到解决方案(可能很简单。)

我有一个包含两列的表,显示哪些 ID 已连接,即属于同一个人。

在此示例中,只有三个人,但其中一个人具有三个唯一 ID。

PID      | EPID
---------+--------
10004835 | 10004835
10015375 | 10015375
10015375 | 10019859
10019859 | 10015375
10019859 | 10019859
10019859 | 10000000
10000000 | 10019859
10020104 | 10020104

我想要做的只是在此表中添加一列,为每个唯一的个体提供唯一的代码。这就像

PID      | EPID     | NPID
---------+----------+-----
10004835 | 10004835 | 1
10015375 | 10015375 | 2
10015375 | 10019859 | 2
10019859 | 10015375 | 2
10019859 | 10019859 | 2
10019859 | 10000000 | 2
10000000 | 10019859 | 2
10020104 | 10020104 | 3

附言。我正在使用 sqlite3,所以请不要在答案中递归。

编辑:除非我能找到适用于 SQLITE3 的解决方案,否则我将不得不使用 MYSQL。在那种情况下,有人知道包含递归的解决方案吗?

4

1 回答 1

2

如果您对任何连接的 ID 链的长度有上限,则可以多次自加入表并获得所有 id 中的最小(或最大):

select pid, epid,
  min(t1.epid,
      coalesce(t2.epid, t1.epid),
      coalesce(t3.epid, t1.epid),
      coalesce(t4.epid, t1.epid),
      coalesce(t5.epid, t1.epid)) npid
from table t1
join table t2 on t1.epid = t2.pid and t2.epid not in (t1.epid)
join table t3 on t2.epid = t3.pid and t3.epid not in (t1.epid, t2.epid)
join table t4 on t3.epid = t4.pid and t4.epid not in (t1.epid, t2.epid, t3.epid)
join table t5 on t4.epid = t5.pid and t5.epid not in (t1.epid, t2.epid, t3.epid, t4.epid)
group by pid, epid
于 2012-06-21T14:27:33.913 回答