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)
谢谢您的帮助。这就是我最终为了让它工作而做的事情。
CREATE VIEW V AS
SELECT *
FROM ((POP NATURAL FULL OUTER JOIN FOOD)
NATURAL FULL OUTER JOIN INCOME);
Run Code Online (Sandbox Code Playgroud)