SQL - 从多个表创建视图
Posted
技术标签:
【中文标题】SQL - 从多个表创建视图【英文标题】:SQL - Create view from multiple tables 【发布时间】:2012-12-01 05:55:24 【问题描述】:我有三张桌子:
POP(country, year, pop)
FOOD(country, year, food)
INCOME(country, year, income)
我正在尝试创建一个视图,例如:
V(country, year, pop, food, income)
到目前为止,这是我的代码。我认为它不正确:
CREATE VIEW V AS
(SELECT * FROM POP
UNION
SELECT * FROM FOOD
UNION
SELECT * FROM INCOME);
一个问题是,POP
中存在的国家/地区可能不在FOOD
中。一年也一样。 POP
中存在的年份可能不会出现在 FOOD
中。所以,我一直认为上面的代码行不通。
【问题讨论】:
这有点偏离轨道。联合连接会整理来自多个表和/或查询的行,这些行和/或查询都具有相同的列。 您的代码还不错,只是您有点困惑。从好的方面来说,你知道你错了,这很重要。是否有任何表具有完整的country
/year
对?您应该在标签中选择 mysql 或 PostgreSQL,这两个数据库的解决方案不一定相同。
【参考方案1】:
联合不是你想要的。您想使用连接来创建单行。有点不清楚是什么构成了表格中的唯一行以及它们之间的真正关系,而且还不清楚一张表是否每年都会为每个国家/地区提供行。但我认为这会奏效:
CREATE VIEW V AS (
SELECT i.country,i.year,p.pop,f.food,i.income FROM
INCOME i
LEFT JOIN
POP p
ON
i.country=p.country
LEFT JOIN
Food f
ON
i.country=f.country
WHERE
i.year=p.year
AND
i.year=f.year
);
左(外)连接将返回第一个表中的行,即使第二个表中没有匹配项。我写这篇文章是假设您在收入表中每年都会为每个国家/地区设置一行。如果你不让事情变得有点毛茸茸,因为我上次检查的 MySQL 没有内置对 FULL OUTER JOIN 的支持。有一些方法可以模拟它,它们将涉及工会。本文对此主题进行了深入探讨:http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/
【讨论】:
【参考方案2】:感谢您的帮助。这就是我最终为了让它发挥作用而做的事情。
CREATE VIEW V AS
SELECT *
FROM ((POP NATURAL FULL OUTER JOIN FOOD)
NATURAL FULL OUTER JOIN INCOME);
【讨论】:
【参考方案3】:这也有效,您不必使用 join 或任何东西:
DROP VIEW IF EXISTS yourview;
CREATE VIEW yourview AS
SELECT table1.column1,
table2.column2
FROM
table1, table2
WHERE table1.column1 = table2.column1;
【讨论】:
【参考方案4】:您使用的是MySQL
还是PostgreSQL
?
您想使用JOIN 语法,不是 UNION。例如,使用 INNER JOIN:
CREATE VIEW V AS
SELECT POP.country, POP.year, POP.pop, FOOD.food, INCOME.income
FROM POP
INNER JOIN FOOD ON (POP.country=FOOD.country) AND (POP.year=FOOD.year)
INNER JOIN INCOME ON (POP.country=INCOME.country) AND (POP.year=INCOME.year)
但是,这只会在每个国家和年份都出现在所有三个表格中时显示结果。如果这不是您想要的,请查看左外连接(使用上面的相同链接)。
【讨论】:
内连接不会返回他们想要的所有行,因为不是所有的年份和国家组合都出现在所有表中。以上是关于SQL - 从多个表创建视图的主要内容,如果未能解决你的问题,请参考以下文章