Sql Oracle:将列移动到新表,消除原始表中剩余的非唯一行,同时保持两个表之间的外部关系
我有一张如下表: 表1:人们最喜欢的食物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
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中留下的对应行名称、地址具有相同的标识符。