Допустим, вы выполняете оператор UPDATE для таблицы, но информация, которую вы помещаете в эту базовую таблицу, взята из какой-то другой вспомогательной таблицы. Обычно вы должны СОЕДИНИТЬ данные и не ожидать, что строки в предложении FROM оператора UPDATE будут умножаться, сохраняя при этом, что одна новая строка отображается в одну старую строку в базовой таблице.
Но мне было интересно, что произойдет, если ваша таблица JOIN будет каким-то образом неоднозначной, например, вы не сможете учесть сопоставление каждого базового объекта только с одним объединенным объектом. Или если вы сделали что-то бессмысленное, например, присоединились к базовой таблице к таблице ее дочерних элементов и обновили базовую таблицу, используя эту информацию. Как бы оно выбрало? Теперь на одну строку базовой таблицы приходится несколько строк.
Я запускал подобный оператор в SQL Server 2005, и казалось, что он выбирает первую строку в каждом наборе. Но мне это кажется неправильным. Не должно ли вылетать ошибка? Почему это желаемое поведение?
Пример кода
-- normal
-- categories are one-to-many bundles
update bundles_denormalized set category = c.description
from bundles_denormalized b
left join categories c
on b.category_id = c.id
-- ambiguous
-- bundles are one-to-many products
update bundles_denormalized set category = p.description
from bundles_denormalized b
left join products p
on b.id = p.bundle_id