使用命名子查询删除
DELETE FROM with named subquery
我有一个 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))
我有一个 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))