Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在一个(排除的)列上选择DISTINCT,但在查询中包括其他列?(甲骨文)_Sql_Oracle - Fatal编程技术网

Sql 如何在一个(排除的)列上选择DISTINCT,但在查询中包括其他列?(甲骨文)

Sql 如何在一个(排除的)列上选择DISTINCT,但在查询中包括其他列?(甲骨文),sql,oracle,Sql,Oracle,因此,我将数据松散地排列如下: 表1-人员:人员id(主键)、父项id、子项id、其他父项字段、其他子项字段 表2-父项:父项\u id(自动递增主键),其他\u字段 表3-子项:子项id(自动递增主键)、父项id(引用父项的外键)和其他子项字段 我希望能够从PEOPLE表中查询所有不同的父项,并将所有其他的父项字段插入parents表,从表1中抛出旧的父项id,以支持表2中自动递增的父项id 我也希望为孩子们做同样的事情,但是维护父子关系,只使用表2和表3中我自己的ID 本质上,我正在尝试改变

因此,我将数据松散地排列如下:

表1-人员:人员id(主键)、父项id、子项id、其他父项字段、其他子项字段

表2-父项:父项\u id(自动递增主键),其他\u字段 表3-子项:子项id(自动递增主键)、父项id(引用父项的外键)和其他子项字段

我希望能够从PEOPLE表中查询所有不同的父项,并将所有其他的父项字段插入parents表,从表1中抛出旧的父项id,以支持表2中自动递增的父项id

我也希望为孩子们做同样的事情,但是维护父子关系,只使用表2和表3中我自己的ID

本质上,我正在尝试改变数据库的设计方式。我不是为所有人创建一个完整的表,而是创建一个PARENTS表和CHILDREN表,后者指的是带有外键的PARENTS表。我从表1中抛出ID的原因是因为我没有理由关心新表中的ID(即编号可以从一开始,其他条目可以自动递增主键)。但是,在从表1中丢弃这些ID之前,我需要捕获它们所传递的父子关系

这可能吗?一个人怎么做呢


为简单起见,我们可以假设没有子女,即某人不能既是父母又是子女

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

诀窍是首先对parent_id、其他_parent_字段进行分组,然后丢弃parent_id(distinct等于group by*)。上述查询仅在其他\u parent\u字段是parent\u 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分配到子表中。然后删除旧字段。

是否必须仅使用sql?您能否编写一个应用程序来实现这一点?还是必须使用pl/sql?我想我应该首先构建与新表类似的临时表,但添加一列来保存旧id,并使用它引用旧数据,应该使查询更简单。我在原始问题中添加了一段澄清。我修改了原始查询并添加了缺少的查询。第一条sql语句末尾的x是否起作用?或者这是一个输入错误?x是派生表的名称。需要在sql server上为其命名。我更喜欢使用in子句和嵌套查询,而不是distinct关键字。应该避免使用Distinct,因为这是对编写错误查询的掩盖。这适用于SQL和Oracle。您可以阅读以下链接以了解更多有关原因的信息。。。。
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