Я знаю, что модели, обозначенные в вопросе, используются в производственных системах на всем протяжении. Довольно большой используется в крупном учреждении университета/обучения, на которое я работаю. Они конкретно используют долгий узкий подход таблицы для отображения, данные, собранные многими, варьировались системы сбора данных.
кроме того, Google недавно выпустил их внутренний протокол совместного использования данных, буфер протокола, как открытый исходный код через их сайт кода. Система баз данных, смоделированная на этом подходе, была бы довольно интересна.
Проверка следующее:
Значения атрибута объекта
Any of the four values in #S
will match your target table's single row value (all values in #S have id = 1 and name = 'A' - so they all match the single row in the target), thus this value will be updated four times - that's what the error says, and it's absolutely right.
What is it you really want to achieve here??
Do you want to set the Address to the first of the values from the source table? Use a TOP 1
clause in your subselect:
MERGE #T
USING (SELECT TOP 1 id, name, address FROM #S) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
UPDATE SET Address = S.Address;
Do you want to set the Address to a random element of the values from the source table? Use a TOP 1
and ORDER BY NEWID()
clause in your subselect:
MERGE #T
USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
UPDATE SET Address = S.Address;
If you match four source rows to a single target row, you'll never get a useful result - you need to know what you really want.
Marc