MySQL Sub-select в ключе дублирования - PullRequest
1 голос
/ 07 мая 2009

Можно ли сделать выбор в операторе IF в ON DUPLICATE KEY UPDATE?

Допустим, я хочу установить стоимость доставки по почтовому индексу, а в случае ввода дублированного почтового индекса я хочу применить самую высокую ставку.

В моей базе данных есть таблица стоимости доставки и таблица почтовых индексов. Таблица почтовых индексов имеет внешний ключ, который ссылается на стоимость доставки, и почтовый индекс, имеющий уникальный индекс.

Когда есть дубликат ключа, я хочу установить идентификатор тарифа доставки на более высокий тариф. Примерно так:

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, а ShippingRateID вставки не используется. Таким образом, без использования LIMIT, все тарифы на доставку возвращаются. Если я использую LIMIT 1, тогда я всегда получу первую оценку, что неверно.

Как сказать суб-выбору использовать ShippingRateID из вставки?

1 Ответ

2 голосов
/ 07 мая 2009
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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...