mysql - 使用命名子查询 DELETE FROM

标签 mysql sql select subquery sql-delete

我有一个如下所示的 SQL 查询:

DELETE
    price.*
FROM
    price
JOIN
    service
ON
    price.service_id = service.id
WHERE
    price.country_from_id NOT IN
        (SELECT
            country_id
        FROM
            carrier_zone_country
        JOIN
            carrier_zone
        ON
            carrier_zone_id = carrier_zone.id
        WHERE
            carrier_zone.carrier_service_id = service.carrier_service_id)
    OR
    price.country_to_id NOT IN
        (SELECT
            country_id
        FROM
            carrier_zone_country
        JOIN
            carrier_zone
        ON
            carrier_zone_id = carrier_zone.id
        WHERE
            carrier_zone.carrier_service_id = service.carrier_service_id)

我希望通过将子查询移入 FROM 子句并为其命名来避免运行子查询两次。然而,这给了我语法错误。查看文档,我可以看到只有 SELECT FROM 子句中可以包含命名子查询。

首先我想知道为什么会这样?其次,我如何重写这个 SQL 查询以避免执行相同的子查询两次。

最佳答案

执行一个 NOT EXISTS 子查询,检查往返国家/地区:

DELETE
    price.*
FROM
    price
JOIN
    service
ON
    price.service_id = service.id
WHERE
NOT EXIST(SELECT
            1
        FROM
            carrier_zone_country
        JOIN
            carrier_zone
        ON
            carrier_zone_id = carrier_zone.id
        WHERE country_id IN (price.country_from_id, price.country_to_id)
          AND carrier_zone.carrier_service_id = service.carrier_service_id))

关于mysql - 使用命名子查询 DELETE FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29745005/

相关文章:

javascript - SQL 查询 2 个表,其中给定日期范围内的值不在两个表中

Mysql单表查询

c# - 当我什么都得不到时却得到空洞的答案

SQL - 按行数排序?

php - 按数据库中分组日期排序

java - 映射异常 : No Dialect mapping for JDBC type: 2002

mysql - 用更有效的方法替换子选择计数

mysql - 始终将 NULL 排序为空字符串或 0

mysql - SELECT 不适用于 Ruby-mysql

mysql - MySQL Cluster 7.3 如何实现 99,999% 的可用性? CAP定理的对立面