Как отлаживать ошибку 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" из таблицы "дилеров".

Другие вопросы по тегам