11

私は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。したがって、上記のコードは機能しないと考え続けています。

4

4 に答える 4

22

組合はあなたが望むものではありません。結合を使用して単一の行を作成したい。テーブルの一意の行を構成するものと、それらが実際にどのように相互に関連しているかは少し不明です。また、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/

于 2012-12-01T06:12:12.300 に答える
5

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

CREATE VIEW V AS
    SELECT *
    FROM ((POP NATURAL FULL OUTER JOIN FOOD)
    NATURAL FULL OUTER JOIN INCOME);
于 2012-12-06T06:16:47.243 に答える
3

またはを使用していますMySQLPostgreSQL

UNIONではなく、 JOIN構文を使用したい。たとえば、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 つのテーブルすべてに存在する場合にのみ結果を表示します。これが望ましくない場合は、(上記の同じリンクを使用して) 左外部結合を調べてください。

于 2012-12-01T06:11:13.627 に答える