2016-10-11 3 views
3
SELECT C.pid 
FROM Catalog C, Suppliers S 
WHERE S.sname = ‘Yosemite Sham’ AND C.sid = S.sid 
AND C.cost ≥ ALL (Select C2.cost 
FROM Catalog C2, Suppliers S2 
WHERE S2.sname = ‘Yosemite Sham’ AND C2.sid = S2.sid) 
+0

[古いスタイルのジョインを使用すると嫌な習慣](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- ANSI - ** 92 ** SQL標準(** 20年以上**)の*正しい* ANSI 'JOIN'構文で置き換えられた古いスタイルの*カンマ区切りのテーブル*前)、その使用はお勧めしません –

答えて

3

最初に、適切で明示的なJOIN構文を使用する方法を学んでください。あなたは最大のコストは1回だけ発生することを前提とした場合

次に、あなたが行うことができます:最後の句は、ANSI標準のSQLであることを

SELECT C.pid 
FROM Catalog C JOIN 
    Suppliers S 
    ON C.sid = S.sid 
WHERE S.sname = 'Yosemite Sham' 
ORDER BY c.Cost DESC 
FETCH FIRST 1 ROW ONLY ; 

注意を。一部のデータベースでは、同じ機能に他の方法を使用しています。

この仮定がない場合、基本的にすべての合理的な方法でサブクエリが使用されます。

SELECT C.pid 
FROM Catalog C JOIN 
    Suppliers S 
    ON C.sid = S.sid LEFT JOIN 
    Catalog C2 
    ON C2.sid = C.sid AND 
     C2.Cost > C.Cost 
WHERE S.sname = 'Yosemite Sham' AND c2.Cost IS NULL 
ORDER BY c.Cost DESC; 

注:ここではないものであるこれはsidsnameと1-1であることを前提としています。これは便利なことです(これは本当らしいでしょう)。Suppliersへの余分な参加を避けるのに役立ちます。

関連する問題