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
に存在しない場合があります。したがって、上記のコードは機能しないと考え続けます。
助けてくれてありがとう。これは私がそれを機能させるためにやったことです。
CREATE VIEW V AS
SELECT *
FROM ((POP NATURAL FULL OUTER JOIN FOOD)
NATURAL FULL OUTER JOIN INCOME);
連合はあなたが望むものではありません。結合を使用して単一の行を作成します。テーブル内の一意の行を構成する要素とそれらが実際にどのように関連しているかは少し不明であり、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/ =
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つのテーブルすべてに各国と年が存在する場合にのみ、結果が表示されます。これが望んでいない場合は、左の外部結合を調べます(上記と同じリンクを使用)。