有问题的问题指出:
返回所有有关画家绘画的可访问信息,这些信息比各自画家所有绘画的平均价格贵。在WHERE子句中使用相关查询。为简单起见,也请使用方便的视图,而不是外部查询中的联接。
这是我得到的视图:
这是我目前拥有的部分解决方案:
SELECT
*
FROM
art
WHERE
price > (SELECT AVG(price) AS 'avg_price'
FROM
art
WHERE
GROUP BY
painter_id);
因此,我知道有一个查询,其返回基于子查询返回的一条信息,但是子查询返回一个信息表(在这种情况下,是特定画家创建的所有画作的平均价格,按painter_id分组)。我知道我需要根据相关绘画中的painter_id从该表中提取一个条目。我的问题是,我不知道如何进行比较。我是否正确实现了子查询?如果没有,我需要改变什么才能回到正轨;如果是这样,我想念什么?我需要第二个子查询来执行此操作,还是只用一个子查询即可?
我是SQL的新手,本周早些时候刚刚了解了子查询。我确实了解常规查询的基础知识,但是目前我对查询和子查询如何相互配合有一个模糊的想法。
这是结果网格中解决方案的外观:
答案 0 :(得分:1)
您的查询非常接近,您只需要使用painter_id
的值将子查询连接(关联)到主查询:
SELECT *
FROM art a1
WHERE price > (SELECT AVG(price)
FROM art a2
WHERE a2.painter_id = a1.painter_id);
请注意,由于您使用painter_id
限定了子查询,因此不再需要GROUP BY
子句。同样,您也不需要别名作为平均价格,因为您从未直接访问该列。
做同样事情的另一种方法是在平均价格表中使用JOIN
:
SELECT *
FROM art a1
JOIN (SELECT painter_id, AVG(price) AS avg_price
FROM art
GROUP BY painter_id) a2
ON a2.painter_id = a1.painter_id AND a1.price > a2.avg_price