2012-04-03 6 views
1

Ich hatte gerade eine Frage über Aliase gestellt und gelernt, dass eine Unterabfrage in einer FROM-Klausel Alias ​​durch Setzen von "AS [Alias-Name]" sein muss. Jetzt laufe ich immer noch auf dasselbe Problem zu.MySQL-Fehler 1248, Erstellen der richtigen Abfrage. x3 Natürliche Joins

Ich versuche, 4 Beziehungen Produkt, Laptop, PC und Drucker zu verbinden.

Ich kann SELECT * FROM product NATURAL JOIN pc; sehr gut und einfach tun. Aber ich versuche zu tun

SELECT * FROM product NATURAL JOIN pc, laptop, printer; 

was ich wusste, würde wahrscheinlich nicht funktionieren, wenn ich es versuchte.

So bin ich zur Zeit auf

SELECT * 
FROM (
SELECT * FROM (
    SELECT * FROM product NATURAL JOIN pc AS prod_pc 
) AS prod_pc_lap NATURAL JOIN laptop 
) NATURAL JOIN printer; 

Aber ich halte einen 1248 Fehler.

Beachten Sie, dass jeder Primärschlüssel für Beziehungen "Modell" ist.

+0

ich meine Antwort gelöscht, weil ich nicht bin zu verstehen, was Ausgabe, die Sie erwarten. Ich frage mich, ob Sie hier wirklich einen Stapel von 'UNION's brauchen, da Drucker sich nicht auf PCs beziehen. –

+0

Ich denke, was ich versuche zu tun ist 'SELECT Modell, Preis von (SELECT * FROM Produkt LINKS JOIN Drucker, Laptop, PC ON Produkt.Model = printer.model = Laptop.model = PC-Modell)' Ich weiß Das ist keine korrekte Syntax, aber ich denke, Sie könnten verstehen, was ich damit meine. Produkt (Hersteller, Modell, Typ) Laptop (Modell, Preis, Geschwindigkeit, Widder, hd, Bildschirm) PC (Modell, Preis, Geschwindigkeit, Widder, hd) Drucker (Modell, Preis, Farbe, Preis) –

Antwort

0

Warum nicht so etwas wie diese:

SELECT p.model, COALESCE(pr.price, l.price, pc.price, 0) AS price 
FROM product p 
LEFT OUTER JOIN printer pr ON pr.model = p.model 
LEFT OUTER JOIN laptop l ON l.model = p.model 
LEFT OUTER JOIN pc ON pc.model = p.model 

Die COALESCE() Funktion wird jedes Argument, um zu bewerten und den ersten Nicht-Null-Wert zurück, es sieht.

0

Die Kommata , haben Sie in der FROM Klausel sind (mehr oder weniger), gleich CROSS JOIN. Also, die Abfrage ist äquivalent zu:

SELECT * 
FROM 
    product 
    NATURAL JOIN 
    pc 
    CROSS JOIN 
    laptop 
    CROSS JOIN 
    printer ; 

Wenn Sie NATURAL JOIN möchten, können Sie haben:

SELECT * 
FROM product 
    NATURAL JOIN pc 
    NATURAL JOIN laptop 
    NATURAL JOIN printer; 

Die oben wahrscheinlich 0 Zeilen angezeigt werden können (es sei denn, Sie ein Produkt, das eine ist PC, Laptop und Drucker zur gleichen Zeit). Sie können versuchen, NATURAL JOIN durch NATURAL LEFT JOIN zu ersetzen.

0

Für Ihren Fall, ich denke, eine innere Verbindung würde auch funktionieren. Anyway, mit jeder Art von Join, können Sie using(key) anstelle von on tbl1.key = tbl2.key verwenden, wenn key gleich ist.

So Ihre Abfrage würde so aussehen

SELECT * 
FROM product 
     INNER JOIN pc 
USING (model) 
     INNER JOIN laptop 
USING (model) 
     INNER JOIN printer 
USING (model);