SQL - 从多个表创建视图

时间:2012-12-01 05:55:25

标签: mysql sql postgresql

我有三张桌子:

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中存在的年份。所以,我一直认为上面的代码不起作用。

4 个答案:

答案 0 :(得分:15)

联盟不是你想要的。您希望使用联接来创建单个行。有些不清楚是什么构成了表格中的独特行以及它们如何真正相互关联,并且还不清楚每个国家/地区是否每行都有一行。但我认为这会奏效:

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 JOINs,我检查了。有一些方法可以模拟它,它们会涉及工会。本文深入探讨了这一主题:http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/

答案 1 :(得分:3)

感谢您的帮助。这就是我最终要做的就是让它发挥作用。

CREATE VIEW V AS
    SELECT *
    FROM ((POP NATURAL FULL OUTER JOIN FOOD)
    NATURAL FULL OUTER JOIN INCOME);

答案 2 :(得分:3)

这也有效,您不必使用join或其他任何方式:

DROP VIEW IF EXISTS yourview;

CREATE VIEW yourview AS
    SELECT table1.column1, 
    table2.column2
FROM 
table1, table2 
WHERE table1.column1 = table2.column1;

答案 3 :(得分:1)

您使用的是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)

但是,这只会显示所有三个表中每个国家/地区和年份的结果。如果这不是您想要的,请查看左外连接(使用上面的相同链接)。