嵌套查询评估

时间:2019-06-11 06:42:45

标签: sql

如何评估嵌套查询?例如:

 SELECT productid, productname, productprice
 FROM   product
 WHERE  productid IN 
(SELECT productid  FROM soldvia     
 GROUP BY productid
 HAVING SUM(noofitems) > 4
 );

方法1::首先执行内部查询并给出结果。外部查询元组与内部查询的每个结果匹配

方法2::对于外部查询的每个元组,将执行内部查询并检查条件。

这是用于非相关查询的方法。

谢谢

3 个答案:

答案 0 :(得分:1)

这取决于数据库。但是,大多数数据库在执行类似以下操作时都很聪明:

SELECT p.productid, p.productname, p.productprice
FROM product p
WHERE p.productid IN (SELECT s.productid
                      FROM soldvia s  
                      GROUP BY s.productid
                      HAVING SUM(s.noofitems) > 4
                     );

数据库将识别出该子查询没有关联,并且仅对其评估一次。如果您想确定的话,可以将其移至FROM子句:

SELECT p.productid, p.productname, p.productprice
FROM product p JOIN
     (SELECT s.productid
      FROM soldvia s  
      GROUP BY s.productid
      HAVING SUM(s.noofitems) > 4
     ) s
     ON s.productid = p.productid;

由于子查询位于FROM子句中,因此保证只对它进行一次评估。

使用正确的索引,关联子查询可能是最快的方法:

SELECT p.productid, p.productname, p.productprice
FROM product p
WHERE (SELECT SUM(s.noofitems)
       FROM soldvia s  
       WHERE s.productid = p.productid
      ) > 4;

正确的索引是soldvia(productid, noofitems)

答案 1 :(得分:0)

您应该结合使用联接和聚合:

SELECT
    p.productid,
    p.productname,
    p.productprice
FROM product p
INNER JOIN soldvia s
    ON p.productid = s.productid
GROUP BY
    p.productid,
    p.productname,
    p.productprice
HAVING
    SUM(s.noofitems) > 4;

联接背后的想法是,每个匹配的产品记录将联接到soldvia表中的一个或多个记录。然后,我们按每种乘积汇总这些行,并断言noofitems的总和大于4。

答案 2 :(得分:0)

根据您的查询,将采用方法2,但是您可以使用join来改进此查询

  SELECT p.productid, p.productname, p.productprice
  FROM   product p
  join soldvia s on p.productid=s.productid
  group by p.productid, p.productname, p.productprice
  having SUM(s.noofitems) > 4