Да, причина, по которой ваш первый запрос терпит неудачу, не имеет ничего общего с оператором обновления, запускающим этот запрос:
select * from dest
where value = (select value from source)
Если у вас есть подзапрос, в котором используется любой из операторов, таких как =,! = И т. Д., Вы не можете вернуть более одного результата. Если вы хотите сказать, дайте мне все значения в dest, где совпадающее значение находится в источнике, то вы должны использовать предложение In:
select * from dest
where value in (select value from source)
Что касается вашей второй части вашего вопроса, то ячейка может иметь только одно значение, поэтому ваши действия заменяют ее снова и снова. Это совершенно верно.
Как вы указали, нет способа определить, какая строка будет выбрана, что делает это интересным, особенно учитывая, что, если память обслуживает разные версии SQL, выбирайте разные строки (более старые версии, я думаю, использовали последнюю строку, где, как и сейчас, они используйте первый ряд).