SQL - 从多个表创建视图

Fid*_*flo 8 mysql sql postgresql

我有三张桌子:

POP(country, year, pop)
FOOD(country, year, food)
INCOME(country, year, income)
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个视图,如:

V(country, year, pop, food, income)
Run Code Online (Sandbox Code Playgroud)

到目前为止这是我的代码.我不认为它是正确的:

CREATE VIEW V AS
(SELECT * FROM POP
UNION
SELECT * FROM FOOD
UNION
SELECT * FROM INCOME);
Run Code Online (Sandbox Code Playgroud)

一个问题是,在场的国家POP可能不在场FOOD.一年也一样.存在的一年POP可能不存在FOOD.所以,我一直认为上面的代码不起作用.

Ili*_*ion 16

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

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
);
Run Code Online (Sandbox Code Playgroud)

左(外)连接将返回第一个表中的行,即使第二个表中没有匹配项也是如此.我已经写了这个,假设你在收入表中每个国家都有一行.如果你不这样做有点毛茸茸,因为MySQL没有内置支持FULL OUTER JOINs,我检查了.有一些方法可以模拟它,它们会涉及工会.本文深入讨论了这个主题:http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/


小智 7

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

DROP VIEW IF EXISTS yourview;

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

Run Code Online (Sandbox Code Playgroud)


Fid*_*flo 5

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

CREATE VIEW V AS
    SELECT *
    FROM ((POP NATURAL FULL OUTER JOIN FOOD)
    NATURAL FULL OUTER JOIN INCOME);
Run Code Online (Sandbox Code Playgroud)