在SQL表上使用什么类型的连接

时间:2017-10-20 04:39:49

标签: sql postgresql join

我有3张包含电影数据的表格。他们被称为骇人听闻,平均而且杰出。他们都有列title_types,流派,年份和评级。我正在尝试将所有3个表连接到一个名为facts的新表中,使用此提示:

仔细考虑这种联接类型 查询以避免丢失各个表中的记录。

我最初的想法是使用完全外连接加入所有表,并进行一些挖掘,这是我的代码

CREATE TABLE Facts as 
SELECT Appalling.title_type, Average.title_type, Outstanding.title_type
FROM Appalling 
FULL OUTER JOIN Average ON Appalling.title_type = Average.title_type
FULL OUTER JOIN Outstanding ON Appalling.title_type = Outstanding.title_type;

但是我不确定这是否是加入所有表格的最明智的方法。任何帮助表示赞赏。我相信最终的输出应该是这样的:

title_type | genre  | year | appalling | average | outstanding
movie        drama    1992    1            NULL      NULL
tv           comedy   2001    NULL          15       NULL
short        drama    2014    NULL         NULL      17

1 个答案:

答案 0 :(得分:2)

这似乎是非常糟糕的数据架构设计。

您应该使用1个表格,其中只有一列表明某部电影是平均电影,还是未成年人电影。

但是,如果失败并且如果两个表中的其他列相似,则可以使用UNION ALL :(已更新,因此您仍然可以区分。

CREATE TABLE Facts -- Data Types are for demo purposes, I have no idea what you use, use the appropriate data type yourself
( 
column_types varchar(500), 
title varchar(500), 
genre varchar(500), 
year int, 
rating int,
ratingType varchar(500)
);

INSERT INTO Facts (column_types, title, genre, year, rating, ratingType)
(
SELECT a.column_types, a.title, a.genre, a.year, a.rating, 'Average' AS ratingType FROM Average AS a
UNION ALL
SELECT ap.column_types, ap.title, ap.genre, ap.year, ap.rating, 'Appalling' AS ratingType FROM Appalling AS ap
UNION ALL
SELECT o.column_types, o.title, o.genre, o.year, o.rating, 'Outstanding' AS ratingType FROM Outstanding AS o
);