11

我有三张桌子:

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

4 回答 4

22

联盟不是你想要的。您想使用连接来创建单行。有点不清楚是什么构成了表格中的唯一行以及它们之间的真正关系,而且还不清楚一张表是否每年都会为每个国家/地区提供行。但我认为这会奏效:

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/

于 2012-12-01T06:12:12.300 回答
5

谢谢您的帮助。这就是我最终为了让它发挥作用而做的事情。

CREATE VIEW V AS
    SELECT *
    FROM ((POP NATURAL FULL OUTER JOIN FOOD)
    NATURAL FULL OUTER JOIN INCOME);
于 2012-12-06T06:16:47.243 回答
4

这也有效,您不必使用 join 或任何东西:

DROP VIEW IF EXISTS yourview;

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

于 2020-03-09T15:38:33.647 回答
3

你是用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)

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

于 2012-12-01T06:11:13.627 回答