2012-06-21 58 views
1

我一直在思考這個問題有一段時間,並不能找到解決方案(這可能是簡單的。)SQL:創建項目唯一的ID與幾個IDS

我有兩列,顯示錶哪些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 

Ps。我正在使用sqlite3所以沒有遞歸的答案請。

編輯:除非我能找到適用於SQLITE3的解決方案,否則我將不得不使用MYSQL。在那種情況下,有沒有人知道包含遞歸的解決方案?

+0

因此,如果EPID =不同行的PID,那麼這個人被認爲是相同的? [你到目前爲止試過什麼SQL?](http://whathaveyoutried.com) –

+1

像(10015375; 10019859)和(10019859; 10015375)這樣的記錄對我來說看起來多餘?也許你應該重新設計你的模式,產生兩個字段 - ID(唯一代理鍵)和EID(你當前的任何ID)。 – Arvo

+1

@Arvo它包含冗餘。但是我正在幫助的女性給我提供數據的方式(她和我一樣沒有技術含量)。 –

回答

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 
+0

謝謝你 - 非常友善。將看明天評論(不確定如何接受答案等工作,我現在必須運行)。 –

+0

「錯誤:靠近」table「:語法錯誤」,但它給了我一些很好的想法和更好的理解SQL。也認爲它會幫助其他人有類似的問題。 (順便說一下,我決定用.csv文件在Python中執行此操作。) –

+0

weeeel ...您必須用實際的表名替換「table」... – Aprillion