2016-01-06 54 views
2

我有一個很大的寬表,用於存儲具有家庭信息的人員的身份信息,如系譜(超過20個列,其中包含特定人員以及他/她的父母和父母的父母)。給定人員的所有數據都可以在一行中獲得。從相關列創建行

我想創建另一個表,其中有來自此原始表的每個人的條目。所以在這個表格(目標)中,我把每個人作爲我的表格中的一個單獨條目,只是他們的媽媽和爸爸的ID(共三列)。

總之,對於原表中的每個人來說,新表格將是id, momid, dadid。因此,考慮到ID 1,他的媽媽(2)應該成爲目標表中的一個新的行,與他們對應的媽媽和爸爸(momofmomiddadofmomid; 4和5)。

這是一張表示原始表格和我需要的圖像。


Table

+0

你的意思是,你基本上是要與剛剛從原表中某些列的新表?使用這些列創建新視圖就足夠了。 –

+0

是的,我需要一個新表格,其中包含原始表格中的一些列。 – Afi

+0

哦,等等,所以你的意思是每個(momId,momOfMomId,dadOfMomId)等都會在新表中創建一個新的元組?哇。這個問題並不明顯。請修改。 –

回答

0

試試這個方法:

SELECT row_number() over (order by momId, dadId) as ID, 
     momId, 
     dadId 
     into newTable 
    FROM (
     SELECT distinct momId, dadId 
      FROM (
       SELECT momId, dadId 
        FROM actualTable 
       UNION 
       SELECT momOfMomId, dadOfDadId 
        FROM actualTable 
       ) tb 
     ) tb2 

哪裏newTable是要創建新表的名稱。

看到它在這裏工作:http://sqlfiddle.com/#!6/31859/1

編輯答案爲OP在他真正需要的註釋說明。 另外,我已經創建了新的ID,所以如果它不正確,請解釋如何處理新表的ID。

編輯

瞭解OP的問題,有一些更多的思考就可以了其實我想通了,這是方式simplier比我思前想後。所以,這裏是新的解決方案:

SELECT id, momId, dadId INTO newTable2 
    FROM (SELECT id, momId, dadId 
      FROM actualTable 
     UNION 
     SELECT momId, momOfMomId, dadOfDadId 
      FROM actualTable 
     ) a; 

此選擇將創建newTable2,如果你並不需要一個新表剛剛從上面的查詢中刪除INTO newTable2條款。要看到在新表中的數據只是做:

SELECT * FROM newTable2 

看到它在這裏工作:http://sqlfiddle.com/#!6/b585b/1

+0

但是其他欄目呢?我需要momid成爲新桌上的新身份證,旁邊還有她的媽媽和爸爸身份證。所以我想我可能需要做一個類似你的選擇,但是對於每個相關的ID並將它們結合在一起。我不確定這是否是解決方案。問題將是將被添加的重複項。在我的例子2中已經在新表中,所以我不會在以後添加它。希望這是有道理的。 – Afi

+1

Ooooh,我現在看到你的問題,沒有從你的樣品中得到它。您必須將您想要添加到新表AS ROWS中的所有字段告知您的問題。像這樣:'目標表將爲每一行媽媽的媽媽和MomOfmomId作爲一個新行',也與dadId列一樣。現在我認爲每個人都像我一樣低調。請編輯你的問題。 –

+0

另外,解釋新表的ID。它應該完全按照你添加的或者它應該是順序的? –