Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Update или MERGE?  [new]
teCa
Member

Откуда: Москва
Сообщений: 948
Добрый день.

Есть 2 таблички, таблица А содержит в себе ФИО и номер телефона, таблица В содержит ФИО и пустое поле Fax. Задача найти соответствия по ФИ и заполнить поле Fax номерами телефонов из таблицы А.

SELECT a.Phone,a.Name,a.Name_i,a.Name_o,b.Name,b.Name_i,b.Name_o,b.Fax
	FROM [AD_Import].[dbo].[AV_Phone] as a, [AD_Import].dbo.BK_Card as b
	where (a.Name = b.Name and a.Name_i=b.Name_i)


Нагуглил вот такую инструкцию с использованием Update

update (select ... From ... where ...) set T1.Values=T2.Values


Но синтаксис не прокатывает

Далее пробую инструкцию с MERGE

MERGE AD_Import.dbo.BK_Card as dst
USING
(
    select a.Phone,a.Name,a.name_i from dbo.AV_Phone a, dbo.BK_Card as b where a.Name = b.Name and a.Name_i=b.Name_i
) AS src (Phone, Name,Name_i)
ON (dst.Name =src.Name and dst.Name_i=src.Name_i)
WHEN MATCHED
    THEN UPDATE SET dst.Fax = src.Phone;


Но в результате получаю вот такой ворнинг
автор
The MERGE statement attempted to UPDATE or DELETE the same row more than once. This happens when a target row matches more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the target table multiple times. Refine the ON clause to ensure a target row matches at most one source row, or use the GROUP BY clause to group the source rows.


Если я правильно понял суть послания, то в источнике присутствую дубликаты строк, но проверка таблицы на дубликаты показывает, что таких нет. Что не так делаю. Заранее спасибо.
13 янв 14, 14:18    [15408149]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
Glory
Member

Откуда:
Сообщений: 104751
teCa
Нагуглил вот такую инструкцию с использованием Update

update (select ... From ... where ...) set T1.Values=T2.Values



Но синтаксис не прокатывает

А открыть хелп продукта для команды UPDATE не пробовали ?
13 янв 14, 14:21    [15408165]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
teCa
Member

Откуда: Москва
Сообщений: 948
Glory
teCa
Нагуглил вот такую инструкцию с использованием Update

update (select ... From ... where ...) set T1.Values=T2.Values



Но синтаксис не прокатывает

А открыть хелп продукта для команды UPDATE не пробовали ?


Пробовал, подобных инструкций не вижу=(
13 янв 14, 14:40    [15408275]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
Glory
Member

Откуда:
Сообщений: 104751
teCa
Пробовал, подобных инструкций не вижу=(

А у вас хелп точно от MSSQL ?
Потому что в оригинальном хелпе уже третий пример статьи команды UPDATE прямо так и называется
C. Using the UPDATE statement with information from another table
13 янв 14, 14:42    [15408286]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
teCa
автор
The MERGE statement attempted to UPDATE or DELETE the same row more than once. This happens when a target row matches more than one source row. A MERGE statement cannot UPDATE/DELETE the same row of the target table multiple times. Refine the ON clause to ensure a target row matches at most one source row, or use the GROUP BY clause to group the source rows.


Если я правильно понял суть послания, то в источнике присутствую дубликаты строк, но проверка таблицы на дубликаты показывает, что таких нет. Что не так делаю. Заранее спасибо.
Проверять нужно не исходные таблицы, а результат запроса внутри USING: у Вас на одну комбинацию (Name, Name_i) может приходиться больше одной записи в любой из таблиц dbo.AV_Phone или dbo.BK_Card - поэтому и вылезают попытки по несколько раз обновить соответствующие записи в целевой таблице AD_Import.dbo.BK_Card.
Соответственно, для "внутреннего" запроса нужно использовать, как минимум, DISTINCT.

ЗЫ. Но "в-целом" использовать MERGE в этом случае - изврат. И где искать "правильный" синтаксис UPDATE для Вашего случая Вам уже подсказали.
13 янв 14, 14:57    [15408364]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
teCa
Member

Откуда: Москва
Сообщений: 948
sphinx_mv
teCa
пропущено...


Если я правильно понял суть послания, то в источнике присутствую дубликаты строк, но проверка таблицы на дубликаты показывает, что таких нет. Что не так делаю. Заранее спасибо.
Проверять нужно не исходные таблицы, а результат запроса внутри USING: у Вас на одну комбинацию (Name, Name_i) может приходиться больше одной записи в любой из таблиц dbo.AV_Phone или dbo.BK_Card - поэтому и вылезают попытки по несколько раз обновить соответствующие записи в целевой таблице AD_Import.dbo.BK_Card.
Соответственно, для "внутреннего" запроса нужно использовать, как минимум, DISTINCT.

ЗЫ. Но "в-целом" использовать MERGE в этом случае - изврат. И где искать "правильный" синтаксис UPDATE для Вашего случая Вам уже подсказали.


Я понял, что источником в нашем случае является USING, добавление DISTINCT не меняет количество строк в выборке, поэтому совпадений внутри USING как я понимаю нет.

Что касается UPDATE, не могу понять применить схему на моей примере:
Как я понимаю, это мой вариант?
USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + 
    (SELECT SUM(so.SubTotal) 
     FROM Sales.SalesOrderHeader AS so
     WHERE so.OrderDate = (SELECT MAX(OrderDate)
                           FROM Sales.SalesOrderHeader AS so2
                           WHERE so2.SalesPersonID = so.SalesPersonID)
     AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
     GROUP BY so.SalesPersonID);
GO
13 янв 14, 15:15    [15408475]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
Glory
Member

Откуда:
Сообщений: 104751
teCa
Как я понимаю, это мой вариант?

Вот ваш вариант
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
    ON sp.BusinessEntityID = so.SalesPersonID
13 янв 14, 15:17    [15408493]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
teCa,

update t set
   f.field = tt.field
from table1 t
 inner join table2 tt on t.id = tt.id
13 янв 14, 15:18    [15408505]     Ответить | Цитировать Сообщить модератору
 Re: Update или MERGE?  [new]
teCa
Member

Откуда: Москва
Сообщений: 948
Спасибо большое =)
13 янв 14, 15:47    [15408759]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить