Допустим, вы выполняете инструкцию 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