我有两个表TableA和TableBNew。这是显示表及其内容的图像的链接:
答案 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
。这似乎没有用。