如何评估嵌套查询?例如:
SELECT productid, productname, productprice
FROM product
WHERE productid IN
(SELECT productid FROM soldvia
GROUP BY productid
HAVING SUM(noofitems) > 4
);
方法1::首先执行内部查询并给出结果。外部查询元组与内部查询的每个结果匹配
方法2::对于外部查询的每个元组,将执行内部查询并检查条件。
这是用于非相关查询的方法。
谢谢
答案 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