2011-09-25 117 views
1

因此,我已数据松散排列是这样的:如何在一个(排除)列上选择DISTINCT,但在查询中包含其他列? (ORACLE)

表1 - 人们:为person_id(主键),PARENT_ID,child_id,other_parent_fields,other_child_fields

表2 - 父母:PARENT_ID(自动递增的主key),other_fields 表3 - 儿童:child_id(自动递增主键),parent_id(外键引用PARENTS)other_fields

我希望能够从PEOPLE表中查询所有不同的父母,并插入将所有other_parent_fields放入PARENTS表中,从favo中抛出表1中的旧parent_id在表2中

我的自动递增PARENT_ID的[R

我也想要做孩子一样,但保持父子关系,只有用自己的IDS从表2和表3

从本质上讲,我试图改变数据库的设计方式。我并没有为所有人提供整张桌子,而是创建了一个PARENTS表和一个CHILDREN表,后者是指带有外键的PARENTS。我从表1中删除id的原因是因为我没有理由在我的新表中关心它们(即编号可以从1开始,并且其他条目可以只是自动递增主键)。但是,在放弃表1中的这些ID之前,我需要捕获它们中继的父子关系。

这甚至可能吗?人们会怎么做呢?

我们可以假设,为了简单起见,没有孩子的孩子,即一个人不能成为父母和孩子

+0

这是否只能是SQL?你可以写一个接口来完成这个任务的应用程序吗?或者你必须使用PL/SQL? – TJR

+0

我只能使用sql。 – finiteloop

+0

我想我会先建立类似于你的新表的临时表,但增加一列来保存旧的ID,并用它来引用回旧数据,应该使查询更简单。 –

回答

2

我没有完全理解你的问题,但似乎你第一次查询会是这样(SQL Server语法) :

insert into Parents 
select other_parent_fields, person_id as legacy_parent_id 
from (select distinct person_id, other_parent_fields from PEOPLE where parent_id is null) x 

诀窍是先对parent_id,other_parent_fields进行分组,然后放弃parent_id。 (一个独立等于*的一个组)。以上查询仅适用于other_parent_fields是parent_id的纯函数。我将你的问题解释为试图规范化非规范化数据,所以我想这是事实。

为了提取你能做到这一点的孩子:

insert into Children 
select other_child_fields, parent_id as legacy_parent_id 
from (select distinct person_id, other_child_fields from PEOPLE where parent_id is not null) x 

现在你的表中包含了不同的家长和孩子们以及他们的旧标识。您现在必须编写一个更新查询,将新的父标识分配到子表中。然后你删除旧字段。

+0

我在原始问题中添加了一段澄清。 – finiteloop

+0

我修改了原来的查询并添加了缺少的查询。 – usr

+0

+1的Oracle语法是一样的...... – Ben

相关问题