Как отлаживать ошибку MySQL 1242 (подзапрос возвращает более 1 строки)?
Есть ли способ заставить MySQL сказать, какой подзапрос дал вышеуказанную ошибку в огромном автоматически сгенерированном запросе, полном подзапросов? Если нет, какова будет ваша стратегия отладки?
2 ответа
Я бы начал с использования LIMIT или DISTINCT в запросе и, возможно, подзапросов. Если бы это не сработало, я бы начал прорабатывать и выполнять каждый подзапрос отдельно, да, это отнимает много времени, но я считаю, что это также помогает избежать той же проблемы в будущем.
Пример запроса:
UPDATE direct_orders do
SET do.dealer_id = (
SELECT d.dealer_id FROM dealers d
INNER JOIN dealer_addresses da
ON da.dealer_id = d.dealer_id
AND da.type = 'M'
AND da.status = 1
INNER JOIN dealer_details dd
ON dd.dealer_id = d.dealer_id
AND dd.status = 1
WHERE ( da.address1 LIKE CONCAT( '%', do.address1, '%' ) AND do.postal LIKE da.postal_code )
OR dd.name LIKE CONCAT( '%', do.company, '%' )
AND do.dealer_id = 0
)
Этот запрос не удался по той же причине, что и постер. Один из способов проверить это должным образом - сделать что-то вроде следующего (обратите внимание на СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ таблицы, на которую ранее полагались для субкорреляции):
SELECT d.dealer_id FROM dealers d
LEFT JOIN direct_orders do
ON do.dealer_id = 0
INNER JOIN dealer_addresses da
ON da.dealer_id = d.dealer_id
AND da.type = 'M'
AND da.status = 1
INNER JOIN dealer_details dd
ON dd.dealer_id = d.dealer_id
AND dd.status = 1
WHERE (da.address1 LIKE CONCAT( '%', do.address1, '%' ) AND do.postal LIKE da.postal_code )
OR dd.name LIKE CONCAT( '%', do.company, '%' )
Выполнение этого показало, что на самом деле была одна запись из таблицы "direct_orders", которая возвращает более одного "dealer_id" из таблицы "дилеров".