簡體   English   中英

SQL - 從多個表創建視圖

[英]SQL - Create view from multiple tables

我有三張表:

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 所以,我一直認為上面的代碼行不通。

聯盟不是你想要的。 您想使用連接來創建單行。 有點不清楚表中的唯一行是由什么構成的,以及它們之間是如何真正關聯的,而且還不清楚一個表是否每年都有針對每個國家/地區的行。 但我認為這會奏效:

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/

謝謝您的幫助。 這就是我最終為了讓它工作而做的事情。

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

這也有效,您不必使用 join 或任何東西:

DROP VIEW IF EXISTS yourview;

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

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

但是,這只會顯示當每個國家和年份都出現在所有三個表中時的結果。 如果這不是您想要的,請查看左外連接(使用上面相同的鏈接)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM