从相关列

时间:2016-01-06 23:57:47

标签: sql sql-server

我有一张宽大的桌子,可以存储人们的家庭信息,如家谱(超过20列,对于某个人及其父母和父母的父母都有id)。一行中的所有数据都可以在一行中获得。

我想创建另一个表,其中包含此原始表中每个人的条目。因此,在这个表格(目标)中,我将每个人作为一个单独的条目放在我的表中,只有他们的妈妈和爸爸的id(总共三列)。

总之,原始表中的每个人的新表格都是id, momid, dadid。所以给定id 1他的妈妈(2)应该成为目标表中的新行,与他们相应的妈妈和爸爸(momofmomiddadofmomid; 4和5)。

这是一张代表原始表格和我需要的图像。

Table

1 个答案:

答案 0 :(得分: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问题并对其进行了更多的思考后,我实际上发现它比我想的要简单得多。所以,这是新的解决方案:

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