我是一个真正的 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'
我是一个真正的 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'
让我们首先使用连接重写查询:
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 都不太可能不进行这种优化。