2010-04-08 10 views
9

MISE À JOUR:SQL: Comment joindre une vue avec une table?

J'utilise MySQL pour créer la déclaration en vue:

Je dois montrer Rédacteurs Prénom, Nom et la ville si elles expédiées plus de 50 livres. Les trois tableaux que j'ai sont:

create table editors (
ed_id char(11), 
ed_lname varchar(20), 
    ed_fname varchar(20), 
    ed_pos varchar(12), 
    phone varchar(10), 
    address varchar(30), 
    city varchar(20), 
    state char(2), 
    zip char(5), 
    ed_boss char(11)); 

create table titleditors (
ed_id char(11), 
title_id char(6), 
ed_ord integer); 

create table salesdetails (
sonum integer, 
qty_ordered integer, 
qty_shipped integer, 
title_id char(6), 
date_shipped date); 

Quelqu'un peut-il me dire quel code serait pour créer ce résultat? Je n'ai pas fait les tables, je dois juste travailler avec ce qu'on m'a donné.

+0

Quel moteur RDBMS utilisez-vous? – Quassnoi

Répondre

18

syntaxe surannés (notez l'entremêlement des conditions de jointure et conditions de filtre):

CREATE VIEW qtyorderedview AS 
    SELECT 
    salesdetails.title_id, salesdetails.qty_shipped, 
    editors.ed_id, editors.ed_lname, editors.ed_fname, editors.city 
    FROM 
    titleditors, salesdetails, editors 
    WHERE 
    titleditors.title_id = salesdetails.title_id 
    AND editors.ed_id = titleditors.ed_id 
    AND salesdetails.qty_ordered > 50 

syntaxe moderne (conditions de jointure et conditions de filtrage sont séparés):

CREATE VIEW qtyorderedview AS 
    SELECT 
    salesdetails.title_id, salesdetails.qty_shipped, 
    editors.ed_id, editors.ed_lname, editors.ed_fname, editors.city 
    FROM 
    titleditors 
    INNER JOIN salesdetails ON titleditors.title_id = salesdetails.title_id 
    INNER JOIN editors  ON editors.ed_id = titleditors.ed_id 
    WHERE 
    salesdetails.qty_ordered > 50 

se joint contre des vues fonctionnent exactement comme se joint aux tables. Utilisez simplement le nom de la vue à la place d'un nom de table normal.

+0

J'utilise une base de données DB2. La syntaxe que vous fournissez semble fonctionner correctement, mais je reçois des erreurs. Peut-être que ma base de données DB2 est bancale. –

+0

EDIT * Merci. Je me demandais comment vous l'avez vérifié. +1 –

+0

@gamerzfuse: Quelle est l'erreur exacte que vous obtenez? – Tomalak

5
SELECT e.* 
FROM (
     SELECT DISTINCT te.ed_id 
     FROM (
       SELECT title_id 
       FROM sales_details 
       GROUP BY 
         title_id 
       HAVING SUM(qty_shipped) > 50 
       ) t 
     JOIN titleditors te 
     ON  te.title_id = t.title_id 
     ) te 
JOIN editors e 
ON  e.ed_id = te.ed_id 
+0

Je pense que votre approche de regroupement est meilleure que ma participation à plat, mais pour moi la question n'est pas assez claire pour être sûre. – Tomalak

+0

Je pense que c'est la bonne solution. Cependant, je ne suis pas sûr de ce que les critères sont exactement. Est-ce plus de 50 livres par titre ou plus de 50 livres par éditeur? Cependant, les deux nécessitent la clause having. –

Questions connexes