web-dev-qa-db-fra.com

SQL - Créer une vue à partir de plusieurs tables

J'ai trois tableaux:

POP(country, year, pop)
FOOD(country, year, food)
INCOME(country, year, income)

J'essaie de créer une vue telle que:

V(country, year, pop, food, income)

C'est mon code jusqu'à présent. Je ne pense pas que ce soit correct:

CREATE VIEW V AS
(SELECT * FROM POP
UNION
SELECT * FROM FOOD
UNION
SELECT * FROM INCOME);

Un problème est qu'un pays présent dans POP peut ne pas être présent dans FOOD. Il en va de même pour l'année. Une année présente dans POP peut ne pas être présente dans FOOD. Donc, je continue de penser que le code ci-dessus ne fonctionnera pas.

8
FidelCashflo

Merci pour l'aide. C'est ce que j'ai fini par faire pour que ça marche.

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

L'union n'est pas ce que vous voulez. Vous souhaitez utiliser des jointures pour créer des lignes uniques. On ne sait pas trop ce qui constitue une ligne unique dans vos tableaux et comment ils se rapportent vraiment les uns aux autres et il n'est pas clair non plus si un tableau aura des lignes pour chaque pays chaque année. Mais je pense que cela fonctionnera:

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

La jointure gauche (externe) renverra des lignes de la première table même s'il n'y a aucune correspondance dans la seconde. J'ai écrit ceci en supposant que vous auriez une ligne pour chaque pays pour chaque année dans le tableau des revenus. Si ce n'est pas le cas, MySQL n'a pas de support intégré pour FULL OUTER JOINs en dernier, j'ai vérifié. Il existe des moyens de le simuler, et ils impliqueraient les syndicats. Cet article approfondit le sujet: http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/ =

16
Ilion

Utilisez-vous MySQL ou PostgreSQL?

Vous souhaitez utiliser la syntaxe JOIN , pas UNION. Par exemple, en utilisant 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)

Cependant, cela ne montrera les résultats que lorsque chaque pays et année sont présents dans les trois tableaux. Si ce n'est pas ce que vous voulez, regardez dans les jointures externes gauche (en utilisant le même lien ci-dessus).

1
cegfault