重写此查询的更好方法?

时间:2019-06-23 10:48:32

标签: mysql sql

我有两个表TableA和TableBNew。这是显示表及其内容的图像的链接:

2 个答案:

答案 0 :(得分:1)

优化规则之一是:  -尽量减少可处理的数据量。

这效率更高一点,但并不短。

这里的区别是,我仅在需要的年份(也就是先过滤,然后加入)进行联接,而不是将所有内容联接起来,然后再进行过滤。

SELECT AB.PART_TYPE, BC.AVG_2012_PRICE
FROM (SELECT TableA.partName AS PART_TYPE, AVG(TableBNew.price) AS AVG_price_2011 
FROM TableA 
INNER JOIN (SELECT * FROM TableBNew  WHERE TableBNew.year=2011)
ON TableA.partID = TableBNew.partID

GROUP BY TableA.partName 
HAVING AVG(TableBNew.price) < 1000) AB

INNER JOIN

(SELECT TableA.partName AS PART_TYPE, AVG(TableBNew.price) AS AVG_price_2012 FROM TableA INNER JOIN (SELECT * FROM TableBNew WHERE TableBNEw.year=2012) ON
TableA.partID = TableBNew.partID
GROUP BY TableA.partName) BC
ON AB.PART_TYPE=BC.PART_TYPE

答案 1 :(得分:1)

您的查询似乎过于复杂。您可以使用条件聚合来简化它:

SELECT b.PartName,
       AVG(CASE WHEN n.year = 2012 THEN n.price END) AS AVG_price_2012 
FROM TableA a JOIN
     TableBNew n
     ON a.PartID = n.PartId
WHERE n.year IN (2011, 2012)
GROUP BY a.partName 
HAVING AVG(CASE WHEN n.year = 2011 THEN n.price END) < 1000;

我不确定您为什么将PartName重命名为PartType。这似乎没有用。