Yes, the reason your first request fails has nothing to do with the update statement, run this request:
select * from dest where value = (select value from source)
When you have a subquery that uses any of the operators, such as =,! =, Etc., you cannot return more than one result. If you want to say, give me all the values ββin dest, where the corresponding value is in the source, you should use the In clause:
select * from dest where value in (select value from source)
As for your second part of your question, the cell can have only one value, so your actions replace it again and again. This is absolutely true.
As you pointed out, there is no way to determine which row will be selected, which makes it interesting, especially considering that if the memory serves different versions of SQL, select different lines (older versions, I think, used the last line, where now they use the first line )
source share