2010-04-08 10 views
9

AKTUALISIERT:SQL: Wie man einer Ansicht mit einer Tabelle beitritt?

Ich verwende MySQL-Anweisung eine Ansicht zu erstellen:

Ich brauche Herausgeber Vornamen, Nachnamen und die Stadt zu zeigen, wenn sie mehr als 50 Bücher ausgeliefert. Die drei Tabellen, die ich habe sind:

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

Kann mir jemand sagen, welcher Code wäre, um dieses Ergebnis zu erstellen? Ich habe die Tische nicht gemacht, ich muss nur mit dem arbeiten, was ich bekommen habe.

+0

Welche RDBMS-Engine verwenden Sie? – Quassnoi

Antwort

18

Antiquated Syntax (beachten Sie die Vermischung von Join-Bedingungen und Filterbedingungen):

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 

Moderne Syntax (Join-Bedingungen und Filterbedingungen sind separat):

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 

gegen Ansichten Joins funktionieren genau wie verbindet sich gegen Tabellen. Verwenden Sie einfach den Namen der Ansicht anstelle eines regulären Tabellennamens.

+0

Ich verwende eine DB2-Datenbank. Die von Ihnen angegebene Syntax sieht so aus, als sollte sie perfekt funktionieren, aber ich bekomme Fehler. Vielleicht ist meine DB2-Datenbank wackelig. –

+0

EDIT * Danke. Ich habe mich gefragt, wie du es überprüft hast. +1 –

+0

@gamerzfuse: Was ist der genaue Fehler, den Sie bekommen? – 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

Ich denke, Ihre Gruppierung Ansatz ist besser als meine Wohnung beitreten, aber für mich ist die Frage nicht klar genug, um sicher zu wissen. – Tomalak

+0

Ich denke, das ist die richtige Lösung. Ich bin mir jedoch nicht sicher, was genau die Kriterien sind. Ist es mehr als 50 Bücher pro Titel oder mehr als 50 Bücher pro Redakteur? Beide erfordern jedoch die having-Klausel. –

Verwandte Themen