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

Откуда: Москва
Сообщений: 5381
Никогда не задумывался, бо сам так не делал, но вот довелось столкнуться в чужой ХП
+
	UPDATE Persons
	SET
		idSocial = tmpPersons.idSocial
		, idWorks = (SELECT TOP 1 idWorks FROM Works WHERE Works.Site = tmpPersons.idWorks)
		, idAddress = (SELECT TOP 1 idAddress FROM Address WHERE Address.Site = tmpPersons.idAddress)
		, Surname = ISNULL(tmpPersons.Surname, ' ')
		, [Name] = ISNULL(tmpPersons.[Name], ' ')
		, Secname = ISNULL(tmpPersons.Secname, ' ')
		, Updated = GETDATE()
		, Snils = tmpPersons.Snils
		, Memo = tmpPersons.Memo
		, BirthDay = tmpPersons.BirthDay
		, Sex = tmpPersons.Sex
		--, IsStranger = CAST(SUBSTRING(tmpPersons.IsStranger, 1, 1) AS BIT)
		, Site = tmpPersons.idPerson
	FROM tmpPersons
			INNER JOIN tmpPolis ON tmpPolis.idPerson = tmpPersons.idPerson
			LEFT JOIN tmpDocuments ON tmpDocuments.idPerson = tmpPersons.idPerson

			LEFT JOIN Persons ON
				Persons.[Name] = tmpPersons.[Name] 
				AND Persons.Surname = tmpPersons.Surname
				AND Persons.SecName = tmpPersons.Secname
				AND Persons.BirthDay = tmpPersons.BirthDay
				AND Persons.IsStranger = tmpPersons.IsStranger
				AND Persons.Site = 0

			LEFT JOIN Polis ON 
				Polis.idPerson = Persons.idPerson
				AND (
				(Polis.SPolis = tmpPolis.SPolis
				AND Polis.NPolis = tmpPolis.NPolis
				AND Polis.PolisDate = tmpPolis.PolisDate)
				OR Polis.PolisGuid = tmpPolis.PolisGuid
				)

			LEFT JOIN Documents AS D ON
				D.idPerson = Persons.idPerson
				AND (
				(D.SDoc = tmpDocuments.SDoc		
				AND D.NDoc = tmpDocuments.NDoc		
				AND D.DocDate = tmpDocuments.DocDate)
				OR D.DocGUID = tmpDocuments.DocGUID
				)
Вопрос: чем чревато использование
UPDATE Tbl SET
   ................
FROM AnotherTbl
?
30 окт 09, 13:37    [7862076]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
aleks2
Guest
Неверно излагаете, у вас тама

UPDATE Tbl SET
   ................
FROM AnotherTbl
JOIN
Tbl

Усе по катехизису.
30 окт 09, 13:39    [7862104]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Senya_L
Вопрос: чем чревато использование
UPDATE Tbl SET
   ................
FROM AnotherTbl
?

Ничем не черевато. Это документированный синтаксис.
30 окт 09, 13:40    [7862108]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1141
Причем очень удобен для обработки данных если есть таблицы из которых нужно вытянуть данные, как вариант отказ от использования курсоров.
30 окт 09, 13:41    [7862119]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Senya_L
Вопрос: чем чревато использование ...
Ответ: ничем. Всё хорошо!
Пока Вы не начнёте пытаться проапдейтить в этом стиле VIEW с триггером INSTEAD OF UPDATE
30 окт 09, 13:42    [7862129]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
lesinsa
Guest
aleks2
Неверно излагаете, у вас тама

UPDATE Tbl SET
   ................
FROM AnotherTbl
JOIN
Tbl

Усе по катехизису.
А соединение-то внешнее. Не очень похоже на катехизис...
30 окт 09, 13:43    [7862135]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
lesinsa
aleks2
Неверно излагаете, у вас тама

UPDATE Tbl SET
   ................
FROM AnotherTbl
JOIN
Tbl

Усе по катехизису.
А соединение-то внешнее. Не очень похоже на катехизис...
А что Вас смущает?
30 окт 09, 13:45    [7862158]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
lesinsa
А соединение-то внешнее. Не очень похоже на катехизис...
План посмотрите...

Сообщение было отредактировано: 30 окт 09, 13:45
30 окт 09, 13:45    [7862159]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
lesinsa
aleks2
Неверно излагаете, у вас тама

UPDATE Tbl SET
   ................
FROM AnotherTbl
JOIN
Tbl

Усе по катехизису.
А соединение-то внешнее. Не очень похоже на катехизис...

BOL

If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. All other references to the object in the FROM clause must include an object alias.
30 окт 09, 13:48    [7862191]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Glory
А соединение-то внешнее. Не очень похоже на катехизис...

BOL

If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. All other references to the object in the FROM clause must include an object alias.[/quot]Это место BOL я видел, с этого в-общем-то и начал. Вот полный вариант
BOL
FROM <источник_таблицы>
Определяет, что для определения критериев операции обновления используется таблица, представление или производный источник таблицы. Дополнительные сведения см. в разделе FROM (Transact-SQL).

Если обновляемый объект тот же самый, что и объект в предложении FROM, и в предложении FROM имеется только одна ссылка на этот объект, псевдоним объекта указывать необязательно. Если обновляемый объект встречается в предложении FROM несколько раз, одна и только одна ссылка на этот объект не должна указывать псевдоним таблицы. Все остальные ссылки на объект в предложении FROM должны включать псевдоним объекта.

Представление с триггером INSTEAD OF UPDATE не может быть целью инструкции UPDATE с предложением FROM.
Для меня понятно, в моем случае в кляузе FROM указывается "производный источник таблицы". Но нет полного понимания, как устанавливается какой записи обновить поля из этого источника.

tpg, вот план
+
  |--Assert(WHERE:(CASE WHEN [Expr1097] IS NULL THEN (0) ELSE CASE WHEN NOT [Pass1099] AND [Expr1098] IS NULL THEN (1) ELSE CASE WHEN NOT [Pass1101] AND [Expr1100] IS NULL THEN (2) ELSE NULL END END END))
       |--Nested Loops(Left Semi Join, PASSTHRU:([Expertiza].[dbo].[Persons].[idAddress] IS NULL), OUTER REFERENCES:([Expertiza].[dbo].[Persons].[idAddress]), DEFINE:([Expr1100] = [PROBE VALUE]))
            |--Nested Loops(Left Semi Join, PASSTHRU:([Expertiza].[dbo].[Persons].[idWorks] IS NULL), OUTER REFERENCES:([Expertiza].[dbo].[Persons].[idWorks]), DEFINE:([Expr1098] = [PROBE VALUE]))
            |    |--Nested Loops(Left Semi Join, OUTER REFERENCES:([Expertiza].[dbo].[Persons].[idSocial]), DEFINE:([Expr1097] = [PROBE VALUE]))
            |    |    |--Clustered Index Update(OBJECT:([Expertiza].[dbo].[Persons].[PK_PERSONS]), OBJECT:([Expertiza].[dbo].[Persons].[SurNameIndex]), OBJECT:([Expertiza].[dbo].[Persons].[IX_1]), OBJECT:([Expertiza].[dbo].[Persons].[IX_2]), OBJECT:([Expertiza].[dbo].[Persons].[idAddress]), OBJECT:([Expertiza].[dbo].[Persons].[IX_Site]), SET:([Expertiza].[dbo].[Persons].[idSocial] = RaiseIfNull([Expertiza].[dbo].[tmpPersons].[idSocial]),[Expertiza].[dbo].[Persons].[idWorks] = [Expertiza].[dbo].[Works].[idWorks],[Expertiza].[dbo].[Persons].[idAddress] = [Expertiza].[dbo].[Address].[idAddress],[Expertiza].[dbo].[Persons].[Surname] = RaiseIfNull([Expr1030]),[Expertiza].[dbo].[Persons].[Name] = RaiseIfNull([Expr1031]),[Expertiza].[dbo].[Persons].[Secname] = RaiseIfNull([Expr1032]),[Expertiza].[dbo].[Persons].[Updated] = RaiseIfNull(getdate()),[Expertiza].[dbo].[Persons].[Snils] = RaiseIfNull([Expr1034]),[Expertiza].[dbo].[Persons].[Memo] = [Expertiza].[dbo].[tmpPersons].[Memo],[Expertiza].[dbo].[Persons].[BirthDay] = RaiseIfNull([Expertiza].[dbo].[tmpPersons].[BirthDay]),[Expertiza].[dbo].[Persons].[Sex] = RaiseIfNull([Expr1035]),[Expertiza].[dbo].[Persons].[Site] = RaiseIfNull([Expr1036])))
            |    |    |    |--Compute Scalar(DEFINE:([Expr1087]=[Expr1087], [Expr1088]=[Expr1088], [Expr1089]=[Expr1089], [Expr1090]=[Expr1090], [Expr1091]=[Expr1091]))
            |    |    |         |--Compute Scalar(DEFINE:([Expr1087]=CASE WHEN [Expr1040] THEN (1) ELSE (0) END, [Expr1088]=CASE WHEN [Expr1039] AND [Expr1040] AND [Expr1041] AND [Expr1042] AND [Expr1046] AND [Expr1047] THEN (1) ELSE (0) END, [Expr1089]=CASE WHEN [Expr1039] AND [Expr1040] AND [Expr1041] AND [Expr1042] AND [Expr1046] AND [Expr1047] THEN (1) ELSE (0) END, [Expr1090]=CASE WHEN [Expr1039] THEN (1) ELSE (0) END, [Expr1091]=CASE WHEN [Expr1048] THEN (1) ELSE (0) END))
            |    |    |              |--Compute Scalar(DEFINE:([Expertiza].[dbo].[Address].[idAddress]=[Expertiza].[dbo].[Address].[idAddress], [ConstExpr1061]=getdate(), [Expr1039]=CASE WHEN [Expertiza].[dbo].[Persons].[idAddress] = [Expertiza].[dbo].[Address].[idAddress] THEN (1) ELSE (0) END, [Expr1040]=CASE WHEN [Expertiza].[dbo].[Persons].[Surname] = [Expr1030] THEN (1) ELSE (0) END, [Expr1041]=CASE WHEN [Expertiza].[dbo].[Persons].[Name] = [Expr1031] THEN (1) ELSE (0) END, [Expr1042]=CASE WHEN [Expertiza].[dbo].[Persons].[Secname] = [Expr1032] THEN (1) ELSE (0) END, [Expr1046]=CASE WHEN [Expertiza].[dbo].[Persons].[BirthDay] = [Expertiza].[dbo].[tmpPersons].[BirthDay] THEN (1) ELSE (0) END, [Expr1047]=CASE WHEN [Expertiza].[dbo].[Persons].[Sex] = [Expr1035] THEN (1) ELSE (0) END, [Expr1048]=CASE WHEN [Expertiza].[dbo].[Persons].[Site] = [Expr1036] THEN (1) ELSE (0) END))
            |    |    |                   |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Expertiza].[dbo].[tmpPersons].[idAddress]))
            |    |    |                        |--Compute Scalar(DEFINE:([Expertiza].[dbo].[Works].[idWorks]=[Expertiza].[dbo].[Works].[idWorks]))
            |    |    |                        |    |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Expertiza].[dbo].[tmpPersons].[idWorks]))
            |    |    |                        |         |--Filter(WHERE:([IsBaseRow1013] IS NOT NULL))
            |    |    |                        |         |    |--Top(ROWCOUNT est 0)
            |    |    |                        |         |         |--Compute Scalar(DEFINE:([Expr1030]=CONVERT_IMPLICIT(varchar(63),isnull([Expertiza].[dbo].[tmpPersons].[Surname],' '),0), [Expr1031]=CONVERT_IMPLICIT(varchar(31),isnull([Expertiza].[dbo].[tmpPersons].[Name],' '),0), [Expr1032]=CONVERT_IMPLICIT(varchar(31),isnull([Expertiza].[dbo].[tmpPersons].[Secname],' '),0), [Expr1034]=CONVERT_IMPLICIT(char(11),[Expertiza].[dbo].[tmpPersons].[Snils],0), [Expr1035]=CONVERT_IMPLICIT(bit,[Expertiza].[dbo].[tmpPersons].[Sex],0), [Expr1036]=CONVERT_IMPLICIT(int,[Expertiza].[dbo].[tmpPersons].[idPerson],0)))
            |    |    |                        |         |              |--Hash Match(Aggregate, HASH:([Expertiza].[dbo].[Persons].[idPerson]), RESIDUAL:([Expertiza].[dbo].[Persons].[idPerson] = [Expertiza].[dbo].[Persons].[idPerson]) DEFINE:([Expertiza].[dbo].[tmpPersons].[idPerson]=ANY([Expertiza].[dbo].[tmpPersons].[idPerson]), [Expertiza].[dbo].[tmpPersons].[idSocial]=ANY([Expertiza].[dbo].[tmpPersons].[idSocial]), [Expertiza].[dbo].[tmpPersons].[idWorks]=ANY([Expertiza].[dbo].[tmpPersons].[idWorks]), [Expertiza].[dbo].[tmpPersons].[idAddress]=ANY([Expertiza].[dbo].[tmpPersons].[idAddress]), [Expertiza].[dbo].[tmpPersons].[Surname]=ANY([Expertiza].[dbo].[tmpPersons].[Surname]), [Expertiza].[dbo].[tmpPersons].[Name]=ANY([Expertiza].[dbo].[tmpPersons].[Name]), [Expertiza].[dbo].[tmpPersons].[Secname]=ANY([Expertiza].[dbo].[tmpPersons].[Secname]), [Expertiza].[dbo].[tmpPersons].[Snils]=ANY([Expertiza].[dbo].[tmpPersons].[Snils]), [Expertiza].[dbo].[tmpPersons].[Memo]=ANY([Expertiza].[dbo].[tmpPersons].[Memo]), [Expertiza].[dbo].[tmpPersons].[BirthDay]=ANY([Expertiza].[dbo].[tmpPersons].[BirthDay]), [Expertiza].[dbo].[tmpPersons].[Sex]=ANY([Expertiza].[dbo].[tmpPersons].[Sex]), [IsBaseRow1013]=ANY([IsBaseRow1013]), [Expertiza].[dbo].[Persons].[idAddress]=ANY([Expertiza].[dbo].[Persons].[idAddress]), [Expertiza].[dbo].[Persons].[Surname]=ANY([Expertiza].[dbo].[Persons].[Surname]), [Expertiza].[dbo].[Persons].[Name]=ANY([Expertiza].[dbo].[Persons].[Name]), [Expertiza].[dbo].[Persons].[Secname]=ANY([Expertiza].[dbo].[Persons].[Secname]), [Expertiza].[dbo].[Persons].[BirthDay]=ANY([Expertiza].[dbo].[Persons].[BirthDay]), [Expertiza].[dbo].[Persons].[Sex]=ANY([Expertiza].[dbo].[Persons].[Sex]), [Expertiza].[dbo].[Persons].[Site]=ANY([Expertiza].[dbo].[Persons].[Site])))
            |    |    |                        |         |                   |--Hash Match(Left Outer Join, HASH:([Expertiza].[dbo].[tmpPersons].[Name], [Expertiza].[dbo].[tmpPersons].[Surname], [Expertiza].[dbo].[tmpPersons].[Secname], [Expertiza].[dbo].[tmpPersons].[BirthDay], [Expr1074])=([Expertiza].[dbo].[Persons].[Name], [Expertiza].[dbo].[Persons].[Surname], [Expertiza].[dbo].[Persons].[Secname], [Expertiza].[dbo].[Persons].[BirthDay], [Expertiza].[dbo].[Persons].[IsStranger]), RESIDUAL:([Expertiza].[dbo].[Persons].[Name]=[Expertiza].[dbo].[tmpPersons].[Name] AND [Expertiza].[dbo].[Persons].[Surname]=[Expertiza].[dbo].[tmpPersons].[Surname] AND [Expertiza].[dbo].[Persons].[Secname]=[Expertiza].[dbo].[tmpPersons].[Secname] AND [Expertiza].[dbo].[Persons].[BirthDay]=[Expertiza].[dbo].[tmpPersons].[BirthDay] AND [Expertiza].[dbo].[Persons].[IsStranger]=[Expr1074]))
            |    |    |                        |         |                        |--Hash Match(Inner Join, HASH:([Expertiza].[dbo].[tmpPolis].[idPerson])=([Expertiza].[dbo].[tmpPersons].[idPerson]), RESIDUAL:([Expertiza].[dbo].[tmpPersons].[idPerson]=[Expertiza].[dbo].[tmpPolis].[idPerson]))
            |    |    |                        |         |                        |    |--Table Scan(OBJECT:([Expertiza].[dbo].[tmpPolis]))
            |    |    |                        |         |                        |    |--Compute Scalar(DEFINE:([Expr1074]=CONVERT_IMPLICIT(bit,[Expertiza].[dbo].[tmpPersons].[IsStranger],0)))
            |    |    |                        |         |                        |         |--Table Scan(OBJECT:([Expertiza].[dbo].[tmpPersons]))
            |    |    |                        |         |                        |--Merge Join(Inner Join, MERGE:([Expertiza].[dbo].[Persons].[idPerson])=([Expertiza].[dbo].[Persons].[idPerson]), RESIDUAL:([Expertiza].[dbo].[Persons].[idPerson] = [Expertiza].[dbo].[Persons].[idPerson]))
            |    |    |                        |         |                             |--Index Seek(OBJECT:([Expertiza].[dbo].[Persons].[IX_Site]), SEEK:([Expertiza].[dbo].[Persons].[Site]=(0)) ORDERED FORWARD)
            |    |    |                        |         |                             |--Index Scan(OBJECT:([Expertiza].[dbo].[Persons].[IX_1]), ORDERED FORWARD)
            |    |    |                        |         |--Top(TOP EXPRESSION:((1)))
            |    |    |                        |              |--Clustered Index Scan(OBJECT:([Expertiza].[dbo].[Works].[PK_WORKS]), WHERE:([Expertiza].[dbo].[Works].[Site]=[Expertiza].[dbo].[tmpPersons].[idWorks]))
            |    |    |                        |--Top(TOP EXPRESSION:((1)))
            |    |    |                             |--Index Seek(OBJECT:([Expertiza].[dbo].[Address].[IX_addresssite]), SEEK:([Expertiza].[dbo].[Address].[Site]=[Expertiza].[dbo].[tmpPersons].[idAddress]) ORDERED FORWARD)
            |    |    |--Clustered Index Seek(OBJECT:([Expertiza].[dbo].[Social].[PK_SOCIAL]), SEEK:([Expertiza].[dbo].[Social].[idSocial]=[Expertiza].[dbo].[Persons].[idSocial]) ORDERED FORWARD)
            |    |--Clustered Index Seek(OBJECT:([Expertiza].[dbo].[Works].[PK_WORKS]), SEEK:([Expertiza].[dbo].[Works].[idWorks]=[Expertiza].[dbo].[Persons].[idWorks]) ORDERED FORWARD)
            |--Clustered Index Seek(OBJECT:([Expertiza].[dbo].[Address].[PK_ADDRESS]), SEEK:([Expertiza].[dbo].[Address].[idAddress]=[Expertiza].[dbo].[Persons].[idAddress]) ORDERED FORWARD)
Где тот фрагмент, на который следует обратить внимание?
30 окт 09, 14:13    [7862452]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Senya_L
Для меня понятно, в моем случае в кляузе FROM указывается "производный источник таблицы". Но нет полного понимания, как устанавливается какой записи обновить поля из этого источника.

Не понял. У вас указана таблица Persons - и в UPDATE и во FROM. Какие проблемы у сервера могут возникнуть с определением того, что ему обновлять ?
30 окт 09, 14:18    [7862508]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
iap
Senya_L
Вопрос: чем чревато использование ...
Ответ: ничем. Всё хорошо!
Пока Вы не начнёте пытаться проапдейтить в этом стиле VIEW с триггером INSTEAD OF UPDATE

а что будет ? )
30 окт 09, 14:24    [7862550]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Senya_L
Где тот фрагмент, на который следует обратить внимание?
Как где?
А этот?
Merge Join(Inner Join, MERGE:([Expertiza].[dbo].[Persons].[idPerson])=([Expertiza].[dbo].[Persons].[idPerson]), RESIDUAL:([Expertiza].[dbo].[Persons].[idPerson] = [Expertiza].[dbo].[Persons].[idPerson]))
30 окт 09, 14:25    [7862552]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Glory
Senya_L
Для меня понятно, в моем случае в кляузе FROM указывается "производный источник таблицы". Но нет полного понимания, как устанавливается какой записи обновить поля из этого источника.

Не понял. У вас указана таблица Persons - и в UPDATE и во FROM. Какие проблемы у сервера могут возникнуть с определением того, что ему обновлять ?
В FROM указана tmpPersons, а Persons джойнится через внешнее соединение. Или разницы нет?

Из-за чего весь сыр-бор... Мне привычно было бы примерно так
update Persons set
.......
from Persons
  join tmpPersons on <условие слияния>
Встретил не подпадающее под личную схему и засомневался :)

Зайцев Фёдор
iap
Senya_L
Вопрос: чем чревато использование ...
Ответ: ничем. Всё хорошо!
Пока Вы не начнёте пытаться проапдейтить в этом стиле VIEW с триггером INSTEAD OF UPDATE

а что будет ? )
BOL
Представление с триггером INSTEAD OF UPDATE не может быть целью инструкции UPDATE с предложением FROM.
30 окт 09, 14:26    [7862557]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
tpg
Senya_L
Где тот фрагмент, на который следует обратить внимание?
Как где?
А этот?
Merge Join(Inner Join, MERGE:([Expertiza].[dbo].[Persons].[idPerson])=([Expertiza].[dbo].[Persons].[idPerson]), RESIDUAL:([Expertiza].[dbo].[Persons].[idPerson] = [Expertiza].[dbo].[Persons].[idPerson]))
Во! Теперь понятнее. Т.е. сервер на указание LEFT JOIN "забил" и все равно сделал внутренее соединение. Так получается?
30 окт 09, 14:28    [7862568]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Senya_L
Glory
Senya_L
Для меня понятно, в моем случае в кляузе FROM указывается "производный источник таблицы". Но нет полного понимания, как устанавливается какой записи обновить поля из этого источника.

Не понял. У вас указана таблица Persons - и в UPDATE и во FROM. Какие проблемы у сервера могут возникнуть с определением того, что ему обновлять ?
В FROM указана tmpPersons, а Persons джойнится через внешнее соединение. Или разницы нет?

Порядок таблиц во FROM роли не играет. Обновляется то, что в UPDATE. И то, что указано в UPDATE может во FROM находится в любом месте
30 окт 09, 14:28    [7862569]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Для понимания можно проанализировать запрос:
	SELECT
		idSocial = tmpPersons.idSocial
		, idWorks = (SELECT TOP 1 idWorks FROM Works WHERE Works.Site = tmpPersons.idWorks)
		, idAddress = (SELECT TOP 1 idAddress FROM Address WHERE Address.Site = tmpPersons.idAddress)
		, Surname = ISNULL(tmpPersons.Surname, ' ')
		, [Name] = ISNULL(tmpPersons.[Name], ' ')
		, Secname = ISNULL(tmpPersons.Secname, ' ')
		, Updated = GETDATE()
		, Snils = tmpPersons.Snils
		, Memo = tmpPersons.Memo
		, BirthDay = tmpPersons.BirthDay
		, Sex = tmpPersons.Sex
		--, IsStranger = CAST(SUBSTRING(tmpPersons.IsStranger, 1, 1) AS BIT)
		, Site = tmpPersons.idPerson
	FROM tmpPersons
			INNER JOIN tmpPolis ON tmpPolis.idPerson = tmpPersons.idPerson
			LEFT JOIN tmpDocuments ON tmpDocuments.idPerson = tmpPersons.idPerson

			LEFT JOIN Persons ON
				Persons.[Name] = tmpPersons.[Name] 
				AND Persons.Surname = tmpPersons.Surname
				AND Persons.SecName = tmpPersons.Secname
				AND Persons.BirthDay = tmpPersons.BirthDay
				AND Persons.IsStranger = tmpPersons.IsStranger
				AND Persons.Site = 0

			LEFT JOIN Polis ON 
				Polis.idPerson = Persons.idPerson
				AND (
				(Polis.SPolis = tmpPolis.SPolis
				AND Polis.NPolis = tmpPolis.NPolis
				AND Polis.PolisDate = tmpPolis.PolisDate)
				OR Polis.PolisGuid = tmpPolis.PolisGuid
				)

			LEFT JOIN Documents AS D ON
				D.idPerson = Persons.idPerson
				AND (
				(D.SDoc = tmpDocuments.SDoc		
				AND D.NDoc = tmpDocuments.NDoc		
				AND D.DocDate = tmpDocuments.DocDate)
				OR D.DocGUID = tmpDocuments.DocGUID
				)
30 окт 09, 14:29    [7862573]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Зайцев Фёдор
а что будет ? )
Сервер обругает, и всё!
Неоднократно поднимали этот вопрос, и перед Microsoft, если не ошибаюсь, тоже.
Полнейшее игнорирование этой надуманной "проблемы" с их стороны!
30 окт 09, 14:30    [7862591]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Зайцев Фёдор
а что будет ? )
Сервер обругает, и всё!
Неоднократно поднимали этот вопрос, и перед Microsoft, если не ошибаюсь, тоже.
Полнейшее игнорирование этой надуманной "проблемы" с их стороны!
Я имел в виду, что проблему "изобрёл" именно Microsoft.
Нет ни одной причины, по которой нельзя было бы апдейтить такое представление обсуждаемым здесь способом.

А то сейчас перечитал своё предыдущее сообщение - какое-то оно двусмысленное получилось.
30 окт 09, 14:35    [7862627]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Понятно. Всем спасибо за разъяснения. Значит мои опасения были напрасны. :)
30 окт 09, 14:39    [7862673]     Ответить | Цитировать Сообщить модератору
 Re: Глупый пятничный вопрос по синтаксису UPDATE  [new]
aleks2
Guest
Senya_L
Понятно. Всем спасибо за разъяснения. Значит мои опасения были напрасны. :)

Ну тама есть некоторые "НО", например, если одной строке Tbl будет соспоставлено НЕСКОЛЬКО строк AnotherTbl, то результат обновления несколько неопределен...

UPDATE Tbl SET x=AnotherTbl.y
FROM AnotherTbl
JOIN
Tbl
30 окт 09, 16:05    [7863441]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить