我的问题是我想从两个表中删除记录,删除作为以下查询结果的记录:
SELECT AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN product_ratings pr
ON pr.product_id = p.product_id
GROUP BY p.product_id
HAVING AVG(pr.rating) < 3
上面的查询显示了小于 3 的产品的平均评分,我想删除上面查询的所有结果的产品及其相关评分。
我查看了 DELETE FROM product_ratings, products WHERE EXISTS(//上面的查询)
,但这没有用,我一直在尝试各种 DELETE 语句都无济于事。
我已阅读以下内容,但仍找不到解决方案:SQL: DELETE Statement & SQL: EXISTS Condition .
表是products
和product_ratings
,结构如下:
products
--------
product_id [PK] | link | ...
product_ratings
---------------
rating_id [PK] | rating | product_id
感谢任何帮助,以及指向引用资料的链接以更好地理解它是如何完成的。
编辑:很抱歉没有说明我使用的是什么 RDBMS,它是 MySQL
EDIT2:现在有点困惑,@Martin 的示例没有像其他答案那样使用临时表,我认为这是因为我的模糊问题没有说明我正在使用的 RDBMS?
最佳答案
您现在已经添加了 MySQL
标记。在那种情况下,这可能适合您。
DELETE products,
product_ratings
FROM products,
product_ratings
WHERE product_ratings.product_id = products.product_id
AND product_ratings.product_id IN
(SELECT product_id
FROM (SELECT p.product_id
FROM products p
LEFT JOIN product_ratings pr
ON pr.product_id = p.product_id
GROUP BY p.product_id
HAVING COALESCE(AVG(pr.rating), 0) < 3) T)
MySQL does support多表删除语法。派生表是为了解决不允许在子查询 ( it materializes the result into a temporary table ) 中引用变异(更新或删除目标)表的问题。
关于sql - 使用 delete/where exists 问题删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046231/