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

Откуда: оттуда
Сообщений: 1088
Доброго всем!

Дано: есть табличка дефектовки (status)
status_id start finish dir eval
105000
205001
350010000
450010001

и таблица дефектов (defect)
defect_id status_id defect
111
214
3115
4310

в последней таблице status_id - внешний ключ на первую таблицу (имена полей совпадают). Так же имеется табличка-словарь (d_defect), в которой величины дефектов 1-к-1 сопоставляются с баллами оценки. Далее выбираются все дефекты на каждую запись в таблице дефектовки (в данном случае для status_id=1 будет выбрано 3 записи, 2->0, 3->1, 4->0), из них выбирается наинизший балл.
Вот, собственно, запрос:
select e.start, e.finish, e.dir,
(
select min(a.evaluation) from
[PROBA].[dbo].[d_defect] as a
join [PROBA].[dbo].defect as b
on (a.defect = b.defect)
join [PROBA].[dbo].status as c
on (b.status_id = c.status_id and b.status_id=e.status_id)
)
from [PROBA].[dbo].status as e
order by e.start, e.finish

Вот засада - БД не моя и влезть в структуру смерти подобно. Мне хотелось бы сделать один UPDATE, который после заполненой таблиц status и defect (в таблице status пустует поле eval - оно расчётное, но, сцуко, есть в таблице) заполнить поле eval.
Т.е. что-то вроде:
update [PROBA].[dbo].status
set f.eval=
(
select min(a.evaluation) from
[PROBA].[dbo].[d_defect] as a
join [PROBA].[dbo].defect as b
on (a.defect = b.defect)
join [PROBA].[dbo].status as c
on (b.status_id = c.status_id and b.status_id=f.status_id)
)
from [PROBA].[dbo].status as f

Этот запрос одна из версий тех нескольких запросов, которые я насочинял за половину дня, но и он нерабочий.
Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "f.evaluation" could not be bound.
Говорит MS SQL, хотя я указал к чему привязать "f"
Подскажите, что я делаю не так.
Заранее благодарен.

--
Если я рассуждаю логично, это значит только то, что я не сумасшедший, но вовсе не доказывает, что я прав (с)И.П. Павлов
2 сен 13, 15:41    [14784882]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
softmaker
update [PROBA].[dbo].status
set f.eval=
(
...
)
from [PROBA].[dbo].status as f

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "f.evaluation" could not be bound.

update f
set eval=
(
...
)
from [PROBA].[dbo].status as f
2 сен 13, 15:47    [14784923]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
Забыл упомянуть, что у d_defect тоже есть поле eval =(

Блин, я же так писал, он ругался на то, что полей много и он разобраться не может, только не был написан "from" и кусок после него =( Спасибо, работает. Обидно, полдня ходил вокруг верного решения.
2 сен 13, 15:54    [14784978]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
aleks2
Guest
update s 
  set eval = ( select MIN(a.evaluation) 
                 from [dbo].defect d 
                      inner join [dbo].d_defect a on d.defect = a.defect 
                 where d.status_id = s.status_id )
  from [dbo].status s
2 сен 13, 16:05    [14785046]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
softmaker
Member

Откуда: оттуда
Сообщений: 1088
2aleks2
Да, действительно второй join становится лишним и его можно опустить.
3 сен 13, 10:14    [14787906]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Yelen
Member

Откуда: Moscow
Сообщений: 3
Всем, привет!
Помогите пожалуйста!
Как объединить два UPDATE в один??


update Studing.SRC 
	set Studing.SRC.Action='update'
	where Studing.SRC.id in (select h.Id from Studing.HIS h inner join Studing.SRC s on h.Id=s.Id)
		and Studing.SRC.Text not in (select h.Text from Studing.HIS h)

update Studing.SRC
set Studing.SRC.Action='no change'
	where Studing.SRC.id in (select h.Id from Studing.HIS h inner join Studing.SRC s on h.Id=s.Id)
		and Studing.SRC.Text in (select h.Text from Studing.HIS h)


Они как бы взаимно противоположные, а мне их нужно в один объединить...
2 окт 13, 15:56    [14913207]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Yelen


Они как бы взаимно противоположные, а мне их нужно в один объединить...


case
2 окт 13, 16:04    [14913297]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Yelen
Member

Откуда: Moscow
Сообщений: 3
StarikNavy,
а как нибудь по-другому с помощью селектов нельзя?
2 окт 13, 16:08    [14913335]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yelen
а как нибудь по-другому с помощью селектов нельзя?

case - это не замена селекта.
2 окт 13, 16:10    [14913363]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Yelen
Member

Откуда: Moscow
Сообщений: 3
Glory,
да мне нельзя использовать case, условие такое
мне нужно конструкцию типа
update
set
from (select)
но я её никак придумать не могу
2 окт 13, 16:13    [14913390]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
Yelen
да мне нельзя использовать case, условие такое

А вы огласите все условия сразу ?
Или будете оглашать по одному, после каждого предложенного решения ?
2 окт 13, 16:16    [14913415]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Yelen
мне нельзя использовать case

Почему нельзя? Кто/что этому препятствует?
2 окт 13, 16:16    [14913417]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
И вообще запрос какой то странный
where Studing.SRC.id in (select h.Id from Studing.HIS h inner join Studing.SRC s on h.Id=s.Id) - зачем джойн по ид, если уже это же ид проверятся в in ?

and Studing.SRC.Text in (select h.Text from Studing.HIS h) - а здесь вообще без корреляции ? просто найди любой совпадающий текст ?
2 окт 13, 16:31    [14913514]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
aleks2
Guest
Yelen
Всем, привет!
Помогите пожалуйста!
Как объединить два UPDATE в один??


update Studing.SRC 
	set Studing.SRC.Action='update'
	where Studing.SRC.id in (select h.Id from Studing.HIS h inner join Studing.SRC s on h.Id=s.Id)
		and Studing.SRC.Text not in (select h.Text from Studing.HIS h)

update Studing.SRC
set Studing.SRC.Action='no change'
	where Studing.SRC.id in (select h.Id from Studing.HIS h inner join Studing.SRC s on h.Id=s.Id)
		and Studing.SRC.Text in (select h.Text from Studing.HIS h)


Они как бы взаимно противоположные, а мне их нужно в один объединить...


Они абсолютно одинаковы по условиям отбора.
Следовательно первый можно просто выбросить.
Ничо не изменится.
2 окт 13, 17:41    [14914047]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Yelen
мне нужно конструкцию типа
update
set
from (select)
но я её никак придумать не могу


ну так у вас в условиях отбора по два условия. Одно из них - одинаковое в обоих случаях, его надо оставить в WHERE. А вторые - противоположны, их можно использовать в SET с кейсом.
2 окт 13, 17:48    [14914089]     Ответить | Цитировать Сообщить модератору
 Re: Сложный UPDATE  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
aleks2
Они абсолютно одинаковы по условиям отбора.

вы NOT не заметили


Yelen
StarikNavy,
а как нибудь по-другому с помощью селектов нельзя?


вот в этом месте case

update Z
set
    Y = case when (X is null)  then 'update' else 'no change'
...
3 окт 13, 11:00    [14916783]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить