Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 Oracle:将列移动到新表,消除原始表中剩余的非唯一行,同时保持两个表之间的外部关系_Sql_Oracle - Fatal编程技术网

Sql Oracle:将列移动到新表,消除原始表中剩余的非唯一行,同时保持两个表之间的外部关系

Sql Oracle:将列移动到新表,消除原始表中剩余的非唯一行,同时保持两个表之间的外部关系,sql,oracle,Sql,Oracle,我有一张如下表: 表1:人们最喜欢的食物 id name address favorite_food ------------------------------------------ 1 Dave 123 Cherry Ln Pizza 2 Dave 123 Cherry Ln Cheeseburger 3 Dave 456 Peachtree St Ice cream 4 Cindy 789 Grove Rd Pizza p

我有一张如下表:

表1:人们最喜欢的食物

id name   address          favorite_food
------------------------------------------
1  Dave   123 Cherry Ln    Pizza
2  Dave   123 Cherry Ln    Cheeseburger
3  Dave   456 Peachtree St Ice cream
4  Cindy  789 Grove Rd     Pizza
person_id  favorite_food
-----------------
1          Pizza
1          Cheeseburger
3          Ice cream
4          Pizza
id-主键

以下列上的唯一键约束:名称、地址和食物

由于每个人都可以有多个喜爱的食物,我想将表1分为两个表,如下所示:

表2:人

id name   address          
--------------------------
1  Dave   123 Cherry Ln    
3  Dave   456 Peachtree St 
4  Cindy  789 Grove Rd     
表3:人们最喜欢的食物

id name   address          favorite_food
------------------------------------------
1  Dave   123 Cherry Ln    Pizza
2  Dave   123 Cherry Ln    Cheeseburger
3  Dave   456 Peachtree St Ice cream
4  Cindy  789 Grove Rd     Pizza
person_id  favorite_food
-----------------
1          Pizza
1          Cheeseburger
3          Ice cream
4          Pizza
我将如何在Oracle中执行此操作

注意:在原始表格中,第1行和第2行代表同一个人最喜爱的食物,因此person\u favorite\u food表格中的最喜爱的食物条目需要对这两个条目具有相同的标识符,尽管初始表格中的标识符不同。

您可以使用:

create table new1 as
    select distinct id, name, address
    from t;

create table new2 as
    select id, favorite_food
    from t;

我建议创建两个新表,不要尝试将现有表变形为一个新表。

使用简单聚合创建表:

create table person as 
select min(id) id, name, address 
  from person_favorite_food
  group by name, address;
在“合并”中使用相同的查询更改某些行的id:

merge into person_favorite_food a
using (select min(id) id, name, address from person_favorite_food group by name, address) b
on (a.name = b.name and a.address = b.address)
when matched then update set a.id = b.id;
删除不需要的列:

alter table person_favorite_food drop (name, address);

完成了。演示。

感谢您的回复。不完全是我需要的。我已经用更多的信息更新了原来的帖子。另外,我希望我能够只创建一个表,并在可能的情况下更新另一个表。@cscdevcm12。这不值得。创建两个包含所需数据的新表。可能不是。为了实现我的目标,在“新1”上的独特之处将仅仅是在名字和地址上。您知道如何解决确保在new1中由于distinct而被删除的行的标识符不在new2中使用的问题吗。这些将需要与new1中留下的对应行名称、地址具有相同的标识符。