Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Помогите, пожалуйста, найти ошибку. Почему этот 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) записей, и упорядочен этот набор по идентификатору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 07:07 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 09:47 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Не обновляются данные очевидно потому что нет данных для которых выполняется условие #maintemp.akod = a.akod Но даже если бы он выполнялся, результат был бы непредсказуем для всех полей кроме akod - вы сопоставляете записи таблицы #maintemp несколько записей набора данных, присвоится первый попавшийся. Инструкция top 100 percent тоже вызывает удивление. То есть грубо говоря на мой взгляд у Вас написано совсем не то что Вам хотелось бы. Посколько я тоже не знаю что Вам надо, то просто посоветую не пользоваться инструкциями ... from (select ... , а использовать временные таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 09:54 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы. 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 в этом коде выполняется неправильно, подскажите как его, или может вообще все, переписать правильно. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 18:25 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Хм, либо я чего-то не понимаю, либо можно вообще обойтись одним запросом 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 20:39 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Опять я лоханулся. Возможен такой вариант таблицы 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2002, 21:51 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Что-то сильно думать мне лень, но на первый взгляд вариант Glory должен работать в любом случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2002, 07:32 |
|
||
|
Помогите с update
|
|||
|---|---|---|---|
|
#18+
Все равно у меня один запрос получается 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 Правда насчет производительности не уверен, что оптимальный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2002, 09:05 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32023968&tid=1823729]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 388ms |

| 0 / 0 |
