sql - 使用 delete/where exists 问题删除记录

标签 sql mysql

我的问题是我想从两个表中删除记录,删除作为以下查询结果的记录:

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 .

表是productsproduct_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/

相关文章:

mysql - 正确选择 UUID 作为主键的数据类型

sql - 重写 WHERE NOT IN 子句的最佳方法?

sql - 获取与另一个表中的行不匹配的行

mysql - 我有一个在 SQL 数据库中查找重复项的查询 - 现在如何删除所述重复项?

MySQL左连接3表错误

php - 查询前设置最后一个ID的值

mysql - 为用户帐户编写系统

MYSQL - 如何解决 66 KB 的行大小限制

mysql - 如何仅使用一个查询来执行当前税率选择?

mysql - 选择成员年龄都在 X 岁以下的 GROUP