如何从现有表创建表
Posted
技术标签:
【中文标题】如何从现有表创建表【英文标题】:How to create table from an existing table 【发布时间】:2022-01-11 01:52:02 【问题描述】:我在 Oracle APEX 中,想从其他现有表创建一个新表,如下所示:
我在 SONGS 表中有一个列:
ARTIST NAME | Another header |
---|---|
Bad Bunny | row |
Bad Bunny, Ozuna, Daddy Yankee | row |
我想把这个放在另一个桌子上:
ID | Artist |
---|---|
1 | Bad Bunny |
2 | Ozuna |
3 | Daddy Yankee |
此外,我想从这 2 个表中创建另一个表或关系,以表明艺术家参与了哪些歌曲。
类似:
Song ID | Artist ID |
---|---|
1 | 1 |
2 | 1 |
2 | 2 |
我希望这第三张表知道某位艺术家参与了哪首歌。
所以我很难从第一个表创建第二个和第三个表。
【问题讨论】:
请不要链接到您问题中的图片。将您拥有的表格的定义和您想要的表格的定义添加到您的问题中,作为可编辑的文本。还要更新您的问题以显示创建目标表所需的逻辑 - 至少提供一些示例数据以及您希望基于该数据实现的结果 在尝试 SQL 查询之前,建议解决一些设计问题。第一个不是规范化表,它甚至没有键。第三个是显示具有两个艺术家 ID 的同一艺术家。 第三个表应该只有 ID(加上任何特定于歌曲/艺术家关系的属性)。您不应该在表之间复制数据 - 阅读规范化,特别是第 3 范式 【参考方案1】:您可以编写并执行如下过程:
create or replace procedure "P_SONG_PARSE"
is
my_artist VARCHAR2(4000);
my_artist_id NUMBER;
my_temp VARCHAR2(4000);
my_pos NUMBER;
begin
for rs in (select * from songs)
loop
my_temp := rs.ARTIST_NAME;
my_pos := 0;
loop
my_pos := instr(my_temp,',');
if my_pos = 0 then
my_artist := trim(my_temp);
else
my_artist := trim(substr(my_temp,1,my_pos-1));
end if;
begin
select ID
into my_artist_id
from ARTISTS
where ARTIST = my_artist;
exception
when no_data_found then
begin
select nvl(max(ID),0) + 1
into my_artist_id
from ARTISTS;
insert into ARTISTS(ID, Artist)
values (my_artist_id, my_artist);
end;
end;
insert into SONG_ARTISTS("Song ID", "Artist ID")
values(rs.ID, my_artist_id);
exit when my_pos = 0;
my_temp := substr(my_temp,my_pos+1);
end loop;
end loop;
end;
【讨论】:
【参考方案2】:这些实际上是一个问题中的 2 个不同的问题。将它们视为 2 个不同的问题。
-
如何设计您的表格。这需要先完成,您可以稍后将数据导入其中。创建一个歌曲表、一个艺术家表和一个相交表 (artist_songs),其中包含艺术家和歌曲的外键。它应该非常简单,网络上有数千个示例,或者,由于您使用的是 apex,因此使用 quicksql(SQL WOrkshop > Utilities > quick sql)生成表也是一种选择。
将该基表中的数据迁移到新的规范化表中。看看这个similar *** question
您提供的有关最初可用数据的信息非常少。它仅以逗号分隔的形式显示艺术家 - 很难说您将如何使用该信息填充歌曲或相交表。
【讨论】:
以上是关于如何从现有表创建表的主要内容,如果未能解决你的问题,请参考以下文章
DB2 z/OS - 为现有表创建表别名/同义词,指向其他现有表