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' 让我们首先使用联接

我对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,具有显式连接操作的版本是迄今为止最清晰的。您可以在ON子句中写入过滤条件,但可以说在(main)WHERE子句中写入过滤条件更为清晰,让优化器向下推送过滤条件。这是一个非常重要的优化,任何生产质量DBMS都不可能不进行优化。

原因是什么?你今天早上刚醒来,你的第一个想法是:“这是一个选择一个随机查询并在那里添加一些子查询的好日子”?我脑海中的声音告诉我……不:),只是一个我无法通过的学校作业。我想我还是在睡觉前把它贴在这里吧,然后在你的问题上加上“家庭作业”的标签,你会喜欢的。帮忙没问题,请提前告诉我们,并帮助指导您。@DRapp
作业不再使用:@Blorgbeard,谢谢您的未来。。。