2017-02-24 10 views
1

各部品の最低価格のサプライヤを探す必要があります。SQLクエリ各部品の最低価格のサプライヤを見つける

テーブル:取引先(SID、SNAME、アドレス)、部品(PID、PNAME、色)、カタログ(SID、PID、コスト)

これは動作します:

SELECT 
    sname, pid 
FROM 
    (SELECT 
     * 
    FROM 
     suppliers 
    NATURAL JOIN catalog 
    NATURAL JOIN (SELECT 
     pid, MIN(cost) AS min_cost 
    FROM 
     catalog 
    GROUP BY (pid)) AS m 
    HAVING cost = min_cost) AS n 

しかし、私はしてみてください以下にそれを短縮するために、私は、having句内の未知のコストがあるというエラーが表示されます。

SELECT 
    sname, pid 
FROM 
    suppliers 
     NATURAL JOIN 
    catalog 
     NATURAL JOIN 
    (SELECT 
     pid, MIN(cost) AS min_cost 
    FROM 
     catalog 
    GROUP BY (pid)) AS m 
HAVING cost = min_cost 

は、なぜそれがコストを見つけることができませんか?サブクエリをカタログに追加したので、テーブルのコストはかかりませんか?

EDITは、私が提案どおりINNER JOINの代わりNATURAL JOINを使用するように変更しましたが、私はまだ同じエラーを取得しています。新しいクエリ:

SELECT 
    s.sname, m.pid 
FROM 
    suppliers s 
     INNER JOIN 
    catalog c ON s.sid = c.sid 
     INNER JOIN 
    (SELECT 
     pid, MIN(cost) AS min_cost 
    FROM 
     catalog 
    GROUP BY (pid)) AS m ON c.pid = m.pid 
HAVING cost = min_cost 

EDIT_2

問題がbbrummの回答で示したように、実際に、WHEREであるべきで、JOINしかしHAVINGませんでした。私はあなたのカラム名にいくつかの仮定を行った

SELECT 
supplier.sname, 
catalog.pid 
FROM suppliers 
INNER JOIN catalog ON suppliers.supplier_id = catalog.supplier_id 
INNER JOIN 
    (SELECT 
    pid, MIN(cost) AS min_cost 
    FROM catalog 
    GROUP BY (pid)) AS m 
ON catalog.pid = m.pid 
WHERE catalog.cost = m.min_cost; 

(例えばSUPPLIER_ID)を変更する必要があります。

+2

「NATURAL JOIN」を忘れてしまった。これは起こるのを待っているバグです(実際には、この場合のように起こっています)。 'ON'または' USING'節を使用してください。 –

+0

@GordonLinoffは、私がそれから何の答えでも見なかった理由を説明します。そしてなぜ私はAccessデータベースを使っているときに私のVBAコースで常に「ON」を使用したのですか?しかし、今は初心者のRDBMSコースと私たちの教授です。可能であればいつでも 'NATURAL JOIN'を使用するように私たちに言っています...未来のことを知っておくと良いです –

+1

Profのように聞こえます。それは質問に答えることを望まない。 – Hogan

答えて

3

私はこのようなクエリを示唆しています。 "cost = min_cost"がJOINの一部であるため、そこにも行くことができるという点があります。また、テーブルエイリアスはベストプラクティスではありません。必須ではありません。

+0

私はちょうど私の質問を更新し、私はあなたのものと同じクエリを持っていました、私はちょうど 'HAVING'を' WHERE'に変更する必要がありました。ありがとう。 –

+0

問題ありません。 FYI - HAVINGはWHEREと同様の機能を果たしますが、通常はGROUP BY句と一緒に使用され、背後の別の場所で実行されます。 – bbrumm

関連する問題