powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с update
9 сообщений из 9, страница 1 из 1
Помогите с update
    #32023898
beginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Помогите, пожалуйста, найти ошибку.

Почему этот update не обновляет данных.

update #maintemp
set #maintemp.akod_ul = a.akod_ul, #maintemp.akod_ved = a.akod_ved, #maintemp.andom = a.andom
from
( select top 100 percent t1.akod, t1.akod_ul, t1.akod_ved, t1.andom
from vl_temp_adrdom as t1 inner join
( select akod
from vl_temp_adrdom
group by akod
having count(*) > 1
) as t2 on t2.akod = t1.akod
order by t1.[id]
) as a
where #maintemp.akod = a.akod

хотя если убрать where, то записи обновляются, но все сразу, значит внутренний запрос возращает правильые данные.

А как ставлю where, то не работает. Почему? Что я не так пишу?

PS. Внутренний запрос возвращает набор повторяющихся (по полю akod) записей, и упорядочен этот набор по идентификатору.
...
Рейтинг: 0 / 0
Помогите с update
    #32023913
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
update #maintemp
set akod_ul = a.akod_ul, akod_ved = a.akod_ved, andom = a.andom
from #maintemp
inner join (select top 100 percent t1.akod, t1.akod_ul, t1.akod_ved, t1.andom
from vl_temp_adrdom as t1
inner join
(select akod from vl_temp_adrdom group by akod having count(*) > 1
) as t2 on t2.akod = t1.akod
order by t1.[id]
) as a
on #maintemp.akod = a.akod
...
Рейтинг: 0 / 0
Помогите с update
    #32023916
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не обновляются данные очевидно потому что нет данных для которых выполняется условие #maintemp.akod = a.akod

Но даже если бы он выполнялся, результат был бы непредсказуем для всех полей кроме akod - вы сопоставляете записи таблицы #maintemp несколько записей набора данных, присвоится первый попавшийся. Инструкция top 100 percent тоже вызывает удивление.
То есть грубо говоря на мой взгляд у Вас написано совсем не то что Вам хотелось бы. Посколько я тоже не знаю что Вам надо, то просто посоветую не пользоваться инструкциями ... from (select ... , а использовать временные таблицы.
...
Рейтинг: 0 / 0
Помогите с update
    #32023958
beginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.

2Glory. Результат не изменился. Я до того как писать на форум, переписывал и через inner join, и еще один select делал.

2SergSuper.
\nНе обновляются данные очевидно потому что нет данных для которых выполняется условие #maintemp.akod = a.akod
Но даже если бы он выполнялся, результат был бы непредсказуем для всех полей кроме akod - вы сопоставляете записи таблицы #maintemp несколько записей набора данных, присвоится первый попавшийся. Инструкция top 100 percent тоже вызывает удивление.
То есть грубо говоря на мой взгляд у Вас написано совсем не то что Вам хотелось бы. Посколько я тоже не знаю что Вам надо, то просто посоветую не пользоваться инструкциями ... from (select ... , а использовать временные таблицы.


Вы правы у меня написано явно не то, что мне нужно , опять же вы правы в том, что присваивается произвольный набор данных (пробовал на другом компьютере, там некоторые данные всетаки обновляются).
top 100 percent использовал потому, что в подзапросах нельзя использовать order by или можно, но только совместно с top.
Как переписать с использованием временных таблиц не знаю, вернее переписать то могу, но результат тот же. Подскажите, пожалуйста как правильно сделать.

А задача такая.

Есть таблица vl_temp_adrdom

akod akod_ul akod_ved andom id
-----------------------------------------------------------------------
3405 72 11 1/1 34
3406 72 11 1/2 35
3407 72 11 1/3 36
3408 72 11 1/4 37
3406 72 11 1/2 38
3409 72 11 1/5 39
3419 72 11 1/16 40
3424 72 11 1/17 41
3419 72 0 000 42
3407 72 222 222 43
3419 72 111 111 44


Нужно получить таблицу #maintemp

akod akod_ul akod_ved andom
----------------------------------------------------------------------
3405 72 11 1/1
3406 72 11 1/2
3407 72 222 222
3408 72 11 1/4
3409 72 11 1/5
3419 72 111 111
3424 72 11 1/17


То есть нужно избавиться от повторяющихся по полю akod записей, и при этом учесть изменения каждого из akod (вернее изменение полей akod_ul, akod_ved, andom) в порядке заданном id.

Писал так:

-- выбираем во временную таблицу все неповторяющиеся записи
select t1.akod, t1.akod_ul, t1.akod_ved, t1.andom
into #maintemp
from vl_temp_adrdom as t1 left outer join
( select akod
from vl_temp_adrdom
group by akod
having count(*) > 1
) as t2 on t2.akod = t1.akod
where t2.akod is null
order by t1.[id]

-- выбираем во временную таблицу все повторяющиеся записи
-- предварительно убрав всю неоднозначность, т.е. соединяем повторяющиеся поля
-- (хотелось бы чтобы так было )
select distinct t2.[min] as id_min
into #temp1
from vl_temp_adrdom as t1 inner join
( select akod, min([id]) as [min]
from vl_temp_adrdom
group by akod
having count(*) > 1
) as t2 on t2.akod = t1.akod
order by t2.[min]

insert into #maintemp
select a.akod, a.akod_ul, akod_ved, andom
from vl_temp_adrdom as a inner join #temp1 as b on b.id_min = a.[id]

update #maintemp
set akod_ul = a.akod_ul, akod_ved = a.akod_ved, andom = a.andom
from #maintemp inner join
( select top 100 percent t1.akod, t1.akod_ul, t1.akod_ved, t1.andom
from vl_temp_adrdom as t1 inner join
( select akod
from vl_temp_adrdom
group by akod
having count(*) > 1
) as t2 on t2.akod = t1.akod
order by t1.[id]
) as a on #maintemp.akod = a.akod

select * from #maintemp

drop table #temp1
drop table #maintemp

Update в этом коде выполняется неправильно, подскажите как его, или может вообще все, переписать правильно.

Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите с update
    #32023967
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, либо я чего-то не понимаю, либо можно вообще обойтись одним запросом

select a.*
from vl_temp_adrdom a
inner join(select akod, max(id) as maxid from vl_temp_adrdom group by akod) as b
on b.akod = a.akod and b.maxid = a.id
order by a.akod
...
Рейтинг: 0 / 0
Помогите с update
    #32023968
beginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять я лоханулся.

Возможен такой вариант таблицы vl_temp_adrdom

akod akod_ul akod_ved andom id
---------------------------------------------------------------------------
3405 72 11 1/1 34
3406 72 11 1/2 35
3407 72 11 1/3 36
3408 72 11 1/4 37
3406 72 11 1/2 38
3409 72 11 1/5 39
3419 72 11 1/16 40
3424 72 11 1/17 41
3419 72 0 000 42
3407 72 222 222 43
3419 72 null 111 44

Соответственно тогда нужно получить таблицу #maintemp

akod akod_ul akod_ved andom
----------------------------------------------------------------------
3405 72 11 1/1
3406 72 11 1/2
3407 72 222 222
3408 72 11 1/4
3409 72 11 1/5
3419 72 0 111
3424 72 11 1/17
...
Рейтинг: 0 / 0
Помогите с update
    #32023991
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то сильно думать мне лень, но на первый взгляд вариант Glory должен работать в любом случае
...
Рейтинг: 0 / 0
Помогите с update
    #32024002
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно у меня один запрос получается


select a.akod,
ISNULL(a.akod_ul, (SELECT TOP 1 c.akod_ul FROM vl_temp_adrdom c WHERE c.akod = a.akod AND c.akod_ul IS NOT NULL ORDER BY id DESC)) AS akod_ul,
ISNULL(a.akod_ved, (SELECT TOP 1 c.akod_ved FROM vl_temp_adrdom c WHERE c.akod = a.akod AND c.akod_ved IS NOT NULL ORDER BY id DESC)) AS akod_ved,
ISNULL(a.andom, (SELECT TOP 1 c.andom FROM vl_temp_adrdom c WHERE c.akod = a.akod AND c.andom IS NOT NULL ORDER BY id DESC)) AS andom
from vl_temp_adrdom a
inner join(select akod, max(id) as maxid from vl_temp_adrdom group by akod) as b
on b.akod = a.akod and b.maxid = a.id
order by a.akod

Правда насчет производительности не уверен, что оптимальный вариант.
...
Рейтинг: 0 / 0
Помогите с update
    #32024090
beginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Glory

Спасибо, вы как всегда правы. Я почему то даже не подумал, что можно просто select'ом вернуть первую правильную запись

PS. Вчера, почему то на сайт никак зайти не мог
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]