首页 > 解决方案 > 加入两个包含csv文件的表进行查询

问题描述

我有两个 csv 文件,一个是关于艺术家的,一个是关于 Billboard 100 歌曲的,看起来像这样:

艺术家(前 4 行)

在此处输入图像描述

广告牌(第一行)

在此处输入图像描述

现在我必须编写一个 SQL 查询来打印每个艺术家以及他们发布的专辑数量和他们拥有的 Billboard100 歌曲的数量,这需要我加入这两个表。我的两个表的架构如下所示:

CREATE TABLE Artist(Artist_ID int not null primary key, 
                    Artist varchar(30), Followers int, 
                    Genres varchar(200), NumAlbums int, 
                    YearFirstAlbum int, Gender char(1), 
                    Group_Solo varchar(5) ); 

CREATE TABLE Billboard(Song_ID int not null primary key, 
                    Artists varchar(90), Name varchar(20), 
                    Weekly_rank int, Peak_position int, 
                    Weeks_on_chart int, Week Date, Date varchar(20),     
                    Genre varchar(20), Writing_Credits varchar(20), 
                    Lyrics varchar(10), Features varchar(20) );

这是我插入 csv 文件时前几行的结果:

在此处输入图像描述

现在您知道在我没有在 billboard 表中插入外键的情况下,查询每个艺术家的最佳方法是什么,以及他们发布的专辑数量以及他们拥有文件的 Billboard100 歌曲的数量?或者我应该修改我的架构?

提前致谢!

标签: sqlsqlitecsvforeign-keys

解决方案


我建议从 Billboard 中删除 Artist 并创建一个新表来保存艺术家和他们的歌曲(特别是考虑到艺术家可以独奏和组)。不建议在 SQL 的同一列中有多个值。此外,最好存储 id 而不是艺术家姓名本身。

您可以创建如下表:

CREATE TABLE Artist_Billboard
(Artist_id int,
Song_id int,
FOREIGN KEY(Artist_id) REFERENCES Artist(Artist_id),
FOREIGN KEY(Song_id) REFERENCES Billboard(Song_id))

一旦你创建了这个表,就很容易提取你需要的信息。你所要做的就是:

select a.Artist, NumAlbums, count(ab.artist_id) Billboard100
from Artist_Billboard  ab
join Artist a on a.Artist_id = ab.Artist_id
group by a.Artist, NumAlbums

数据库小提琴:https ://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=a3e9ec59b590e2cbeea0668e2eac0bc1

更新以下评论中的问题: 我不确定我是否理解您的问题。如果您询问如何识别歌曲 ID 和艺术家 ID 并执行插入,请参阅https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=973235257b17dff0900f8adfe6afcd6d

目前歌曲名称和艺术家名称是硬编码的。你将不得不做类似的事情。


推荐阅读