2012-04-03 7 views
1

私はエイリアスに関する質問をしただけで、FROM句のサブクエリに "AS [エイリアス名]"を付けることによって別名を付ける必要があることを知りました。今私はまだ同じ問題に走っています。MySQLエラー1248、適切なクエリの作成。 x3ナチュラルジョイン

私は4自然関係の製品、ラップトップ、PC、プリンターを自然に結合しようとしています。

私はSELECT * FROM product NATURAL JOIN pc;非常に細かく簡単です。しかし、私はしようとしています。私がしようとしたときにおそらく動作しないと分かっていたのですが。

だから私は

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

で現在ですが、私は1248エラーを取得しておきます。

各リレーションの主キーは「モデル」です。

+0

ようになります。プリンタがPCに関係しないので、ここで実際に必要なのは 'UNION'のスタックです。 –

+0

私は何をしようとしていると思います 'モデル、価格から選択してください(LEFT JOINプリンタ、ラップトップ、PC ON product.model = printer.model = laptop.model = pc.model)' 私は知っていますこれは適切な構文ではありませんが、私はあなたがそれが意味するものを理解することができると思います。 製品(メーカー、型式) ノートパソコン(モデル、価格、スピード、ラム、hd、スクリーン) PC(モデル、価格、スピード、ラム、HD) プリンタ(モデル、価格、色、価格) –

答えて

0

なぜこのようなものではない:

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 

COALESCE()機能は順番に各引数を評価し、それを見て最初の非null値を返します。

0

あなたがFROM句にあるコンマ,は、多かれ少なかれCROSS JOINに相当します。だから、あなたのクエリは同等です:あなたはNATURAL JOINをしたい場合は、あなたが持つことができる

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

:あなたがある製品を持っていない限り、

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

上記のことは、おそらく(0行を返します。 PC、ラップトップ、プリンターを同時に使用できます)。 NATURAL JOINNATURAL LEFT JOINに置き換えることができます。

0

あなたの場合、私は内部結合もうまくいくと思います。とにかく、どんな種類の結合でも、keyが同じなら、on tbl1.key = tbl2.keyの代わりにusing(key)を使用できます。

だからあなたのクエリは、私はあなたが期待するものを出力理解していないよので、私は私の答えを削除

SELECT * 
FROM product 
     INNER JOIN pc 
USING (model) 
     INNER JOIN laptop 
USING (model) 
     INNER JOIN printer 
USING (model); 
関連する問題