0

私はSQLの初心者ですが、このクエリで代わりに「サブクエリ」を使用する方法を誰か教えてもらえますか?...テーブルを結合する代わりに、私は今やっていると推測しています:

select Produkt.Namn from Produkt, Kund, InkOrder
where Produkt.ProdId = InkOrder.ProdId 
AND InkOrder.KundId = Kund.KundId
AND InkOrder.Datum = '2011-09-24'
AND Kund.Namn = 'Allstad'
4

1 に答える 1

2

最初に結合を使用してクエリを書き直しましょう。

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 がその最適化を行わない可能性はほとんどありません。

于 2012-11-29T02:45:36.490 に答える