最初に結合を使用してクエリを書き直しましょう。
SELECT Produkt.Namn
FROM Produkt
JOIN InkOrder ON Produkt.ProdId = InkOrder.ProdId
JOIN Kund ON InkOrder.KundId = Kund.KundId
WHERE InkOrder.Datum = '2011-09-24'
AND Kund.Namn = 'Allstad'
次に、WHERE 句の条件を ON 句にプッシュ ダウンできることに注意してください。
SELECT Produkt.Namn
FROM Produkt
JOIN InkOrder ON Produkt.ProdId = InkOrder.ProdId AND InkOrder.Datum = '2011-09-24'
JOIN Kund ON InkOrder.KundId = Kund.KundId AND Kund.Namn = 'Allstad'
したがって、サブクエリが本当に良いアイデアである場合 (おそらくそうではありませんが、オプティマイザがそれを見つけて結合のように処理する可能性は十分にあります)、次のように記述できます。
SELECT Produkt.Namn
FROM Produkt
JOIN InkOrder ON Produkt.ProdId = InkOrder.ProdId AND InkOrder.Datum = '2011-09-24'
WHERE InkOrder.KundId IN (SELECT KundID FROM Kund WHERE Namn = 'Allstad')
次に、2 番目のサブクエリを取得します。
SELECT Produkt.Namn
FROM Produkt
WHERE Produkt.ProdId IN
(SELECT ProdId
FROM InkOrder
WHERE Datum = '2011-09-24'
AND KundId IN (SELECT KundID FROM Kund WHERE Namn = 'Allstad')
)
OTOH、明示的な JOIN 操作を含むバージョンは、はるかに明確です。フィルタ条件は ON 句に記述できますが、(メインの) WHERE 句に記述して、オプティマイザにフィルタ条件を押し下げる方が間違いなく明確です。これは非常に重要な最適化であるため、本番品質の DBMS がその最適化を行わない可能性はほとんどありません。