如何在一个(排除的)列上选择DISTINCT,但在查询中包含其他列? (ORACLE)

时间:2011-09-25 21:10:06

标签: sql oracle

所以我的数据排列如下:

表1 - PEOPLE:person_id(主键),parent_id,child_id,other_parent_fields,other_child_fields

表2 - PARENTS:parent_id(自动递增主键),other_fields 表3 - CHILDREN:child_id(自动递增主键),parent_id(引用PARENTS的外键)other_fields

我希望能够从PEOPLE表中查询所有不同的父项,并将所有other_parent_fields插入到PARENTS表中,从表1中抛出旧的parent_id,以支持我在表中的自动递增parent_id 2。

我也希望为孩子们做同样的事情,但保持父子关系,只使用我自己的表2和表3中的id。

基本上,我试图改变数据库的设计方式。我创建了一个PARENTS表和一个CHILDREN表,而不是一个适用于所有人的整个表,后者使用外键引用PARENTS。我从表1中丢弃id的原因是因为我没有理由在我的新表中关注它们(即编号可以从一个开始,而其他条目可以自动递增主键)。但是,在从表1中丢弃这些ID之前,我需要捕获它们中继的父子关系。

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

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

1 个答案:

答案 0 :(得分: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

现在,您的表格包含不同的父母和子女以及旧ID。您现在必须编写一个更新查询,将新的父ID分配给子表。然后删除旧字段。