Sql 是否重写查询以使用子查询?
我对SQL非常在行,但是有谁能告诉我如何让这个查询使用“子查询”来代替?。。。我想我现在做的不是加入表格,而是:Sql 是否重写查询以使用子查询?,sql,Sql,我对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, 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,具有显式连接操作的版本是迄今为止最清晰的。您可以在ON子句中写入过滤条件,但可以说在(main)WHERE子句中写入过滤条件更为清晰,让优化器向下推送过滤条件。这是一个非常重要的优化,任何生产质量DBMS都不可能不进行优化。原因是什么?你今天早上刚醒来,你的第一个想法是:“这是一个选择一个随机查询并在那里添加一些子查询的好日子”?我脑海中的声音告诉我……不:),只是一个我无法通过的学校作业。我想我还是在睡觉前把它贴在这里吧,然后在你的问题上加上“家庭作业”的标签,你会喜欢的。帮忙没问题,请提前告诉我们,并帮助指导您。@DRapp
作业不再使用:@Blorgbeard,谢谢您的未来。。。