web-dev-qa-db-ja.com

SQL-複数のテーブルからビューを作成

3つのテーブルがあります。

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);

1つの問題は、POPに存在する国がFOODに存在しない場合があることです。同じことが一年も続きます。 POPに存在する年は、FOODに存在しない場合があります。したがって、上記のコードは機能しないと考え続けます。

8
FidelCashflo

助けてくれてありがとう。これは私がそれを機能させるためにやったことです。

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

連合はあなたが望むものではありません。結合を使用して単一の行を作成します。テーブル内の一意の行を構成する要素とそれらが実際にどのように関連しているかは少し不明であり、1つのテーブルに毎年すべての国の行があるかどうかも不明です。しかし、これはうまくいくと思います:

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
);

左(外部)結合は、2番目のテーブルに一致するものがない場合でも、最初のテーブルから行を返します。これは、収入テーブルに毎年、国ごとに行があると仮定して書いています。 MySQLには最後にチェックしたFULL OUTER JOINのサポートが組み込まれていないため、物事が少し難しくなります。それをシミュレートする方法があり、それらには組合が関与するでしょう。この記事では、この主題についてある程度詳しく説明します。 http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/ =

16
Ilion

MySQLまたはPostgreSQLを使用していますか?

[〜#〜] join [〜#〜] 構文、notUNIONを使用します。たとえば、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)

ただし、3つのテーブルすべてに各国と年が存在する場合にのみ、結果が表示されます。これが望んでいない場合は、左の外部結合を調べます(上記と同じリンクを使用)。

1
cegfault