Проблемы с оператором SQL Server MERGE

Я знаю, что модели, обозначенные в вопросе, используются в производственных системах на всем протяжении. Довольно большой используется в крупном учреждении университета/обучения, на которое я работаю. Они конкретно используют долгий узкий подход таблицы для отображения, данные, собранные многими, варьировались системы сбора данных.

кроме того, Google недавно выпустил их внутренний протокол совместного использования данных, буфер протокола, как открытый исходный код через их сайт кода. Система баз данных, смоделированная на этом подходе, была бы довольно интересна.

Проверка следующее:

Google Protocol Buffer

модели

Значения атрибута объекта

18
задан marc_s 18 November 2014 в 09:36
поделиться

1 ответ

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

24
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: