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')

然后得到第二个子查询:

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 回答