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 - 从多个表创建视图的主要内容,如果未能解决你的问题,请参考以下文章

从多个查询创建视图

sql视图实例

将联合 SQL 视图加载到访问表中

[QT][SQL]sql学习记录5_sqlite视图(View)

用于创建视图的 ODB PL/SQL API?

SQL 使用临时表创建视图