SQL запрос возвращает «более одной строки, возвращенной подзапросом, используемым в качестве выражения» - PullRequest
0 голосов
/ 07 мая 2020

У меня есть две таблицы:

table1 имеет имя столбца a,b и c.
table2 имеет имя столбца d и e.

Мне нужно установить table1.a со значением table1.b, только если table1.c=table2.d и table2.e='true' (это логическое значение).

Я написал следующее:

UPDATE table1 SET a=(

SELECT t1.b
FROM table1 t1

INNER JOIN table2 t2

ON t1.c = t2.d

WHERE t2.e = 'true');

и, конечно же, получил:

ОШИБКА: более одной строки, возвращенной подзапросом, использованным как выражение

********** Ошибка ***** *****

ОШИБКА: более одной строки, возвращенной подзапросом, используемым в качестве выражения SQL состояние: 21000

Как мне изменить это, чтобы оно работало?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Присоединяйтесь к таблицам следующим образом:

UPDATE table1 t1
INNER JOIN table2 t2
ON t1.c = t2.d
SET t1.a = t1.b
WHERE t2.e;

Если (как вы говорите) t2.e равно boolean, то WHERE t2.e достаточно. Если бы это было varchar, вам понадобится WHERE t2.e = 'true'.

0 голосов
/ 07 мая 2020

Я бы порекомендовал exists:

UPDATE table1 t1 
    SET t1.a = t1.b
    WHERE EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t1.c = t2.d AND t2.e = 'true'
                 );

Для повышения производительности вам нужен индекс на table2(d, e). Использование exists означает, что MySQL не будет пытаться обновить строку дважды, если в table2 есть несколько совпадающих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...