在重复密钥更新时是否可以在IF语句中执行select?
假设我想按邮政编码设置运费,如果输入了重复的邮政编码,我想应用最高的运费。
我的数据库有一个运费表和一个邮政编码表。邮政编码表有一个引用运费的外键,以及一个具有唯一索引的邮政编码。
当有重复的密钥时,我想将运费ID设置为较高的运费。像这样的:INSERT INTO ZipCodes (ShippingRateID, Zip) VALUES (11, '13754') ON DUPLICATE KEY UPDATE ShippingRateID = IF((SELECT Rate FROM ShippingRates sr WHERE sr.ShippingRateID = ShippingRateID) > [current rate], ShippingRateID, VALUES(ShippingRateID))
当我尝试执行这个查询时,MySQL告诉我“子查询返回了多个记录”。由于ShippingRates表中只有一个匹配的记录,我不理解如何返回多个记录。实际发生的情况是,在子选择中,ShippingRateID始终引用ShippingRates表,而insert的ShippingRateID未被使用。所以没有使用限制,所有的运费都被退回。如果我使用限制1,那么我总是得到第一个速率,这是错误的。
如何告诉子选择使用insert中的ShippingRateID?
最佳答案
INSERT INTO ZipCodes
(ShippingRateID, Zip)
VALUES (11, '13754')
ON DUPLICATE KEY
UPDATE ShippingRateID =
(SELECT IF(Rate > [current rate], ShippingRateID, VALUES(ShippingRateID))
FROM (
SELECT ShippingRateID AS AltID, Rate
FROM ShippingRates
) AS sr
WHERE sr.AltID = ShippingRateID
LIMIT 1
)