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

Откуда:
Сообщений: 205
Необходимо реализовать update, который бы обновлял в таблице поле AwgPositionPrice, соответствующий определённой дате, значениями AwgPositionPrice этой же таблицы, соответствующей другой дате при некотрых условиях. Я попробовал так:
update DepoLimits
set AwgPositionPrice=COALESCE(
  (select d.AwgPositionPrice
  from DepoLimits d
  where d.LoadDate=CONVERT(datetime,'23.12.2013',104) and d.AwgPositionPrice!=0
	and d.LimitKind='T0'
	and d.ClientCode=ClientCode
	and d.SecCode=SecCode
	and d.FirmId=FirmId
	and d.Trdacc=Trdacc)
   ,0)
where LoadDate=CONVERT(datetime,'24.12.2013',104) and AwgPositionPrice=0

Но пишет ошибку:
Msg 512, Level 16, State 1, Line 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.

Как правильно реализовать данный запрос?
25 дек 13, 18:13    [15346836]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать Update c SQL подзапросом  [new]
adv
Member

Откуда:
Сообщений: 3333
Degun
...
Но пишет ошибку:
Msg 512, Level 16, State 1, Line 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.

Как правильно реализовать данный запрос?
Сделать, чтобы

вложенный запрос вернул одно значение.
25 дек 13, 18:22    [15346854]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать Update c SQL подзапросом  [new]
Degun
Member

Откуда:
Сообщений: 205
Да. Я так понял, что вложенный подзапрос возвращает более одной записи, т. к. в разделе where подзапроса sql не понимает, что поля с правой стороны равенства относятся к внешней таблице. Т. е. по сути он эквивалентен запросу:

update DepoLimits
set AwgPositionPrice=COALESCE(
  (select d.AwgPositionPrice
  from DepoLimits d
  where d.LoadDate=CONVERT(datetime,'23.12.2013',104) and d.AwgPositionPrice!=0
	and d.LimitKind='T0'
	and d.ClientCode=d.ClientCode
	and d.SecCode=d.SecCode
	and d.FirmId=d.FirmId
	and d.Trdacc=d.Trdacc),0)
where LoadDate=CONVERT(datetime,'24.12.2013',104) and AwgPositionPrice=0
25 дек 13, 18:31    [15346892]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать Update c SQL подзапросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
update x set
x.Field = y.Field
from DepoLimits x
inner join DepoLimits y on
и все ваши условия
25 дек 13, 18:36    [15346908]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать Update c SQL подзапросом  [new]
Degun
Member

Откуда:
Сообщений: 205
Спасибо. Вот правильный вариант:
update t
set t.AwgPositionPrice=d.AwgPositionPrice
from DepoLimits t
  inner join DepoLimits d ON
    d.LoadDate=CONVERT(datetime,'23.12.2013',104) and d.AwgPositionPrice!=0
	and d.LimitKind=t.LimitKind
	and d.ClientCode=t.ClientCode
	and d.SecCode=t.SecCode
	and d.FirmId=t.FirmId
	and d.Trdacc=t.Trdacc
where t.LoadDate=CONVERT(datetime,'24.12.2013',104) and t.AwgPositionPrice=0
25 дек 13, 18:58    [15346967]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить