如何从现有表创建表

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

您提供的有关最初可用数据的信息非常少。它仅以逗号分隔的形式显示艺术家 - 很难说您将如何使用该信息填充歌曲或相交表。

【讨论】:

以上是关于如何从现有表创建表的主要内容,如果未能解决你的问题,请参考以下文章

sql 从现有数据创建表

如何在大查询中在现有表上创建分区和集群?

DB2 z/OS - 为现有表创建表别名/同义词,指向其他现有表

如何创建一个表,其行引用 2 个现有表中的 1 个(且仅 1 个)?

如何获取/生成现有配置单元表的创建语句?

iOS:从现有单元格以编程方式创建表“标题”