【问题标题】:DELETE FROM with named subquery使用命名子查询删除
【发布时间】:2015-04-20 10:11:41
【问题描述】:

我有一个如下所示的 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,检查 price.country_from_id 和 price.country_to_id。
  • 是mysql还是sqlserver?
  • @Deepshikha,你为什么怀疑 SQL Server?
  • @jarlh 你能解释一下如何使用NOT EXISTS吗?

标签: mysql sql select subquery sql-delete


【解决方案1】:

执行一个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))

【讨论】:

  • 如果country_from_idcountry_to_id 不存在,我当前的查询将删除记录,这只会在country_from_id country_to_id 都不存在时删除记录,不会吗?
  • 如果 country_from_id 或 country_to_id 不存在应该删除。但是你最好在投入生产之前尝试一下。
  • 我将子查询更改为 COUNT,然后检查它是否小于 2。现在它可以工作了,谢谢。
猜你喜欢
  • 2015-12-16
  • 2021-07-01
  • 1970-01-01
  • 2014-02-16
  • 2012-07-24
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多