MySQL在Sub DUPLICATE KEY中进行子选择

时间:2009-05-07 13:29:14

标签: mysql

是否可以在ON DUPLICATE KEY UPDATE中的IF语句中进行选择?

假设我想通过邮政编码设置运费,如果输入重复的邮政编码,我想申请最高费率。

我的数据库有一个运费表和一个邮政编码表。邮政编码表具有引用运费的外键,以及具有唯一索引的邮政编码。

如果有重复的密钥,我想将运费率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告诉我“Subquery返回了多条记录”。由于ShippingRates表中只有一个匹配的记录,我不明白如何返回多个记录。实际发生的是,在子选择中,ShippingRateID始终引用ShippingRates表,并且未使用插入的ShippingRateID。因此,如果不使用LIMIT,则返回所有运费。如果我确实使用LIMIT 1,那么我将始终获得第一个速率,这是错误的。

如何告诉子选择使用插入中的ShippingRateID?

1 个答案:

答案 0 :(得分:2)

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
    )