powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли updat - ить не использую курсора и #tmp
10 сообщений из 10, страница 1 из 1
Можно ли updat - ить не использую курсора и #tmp
    #32047478
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть табличка в которой хранятся периодический реквизит (зависимый от года и месяца) - лимит разрешенных затрат.
Справочник лимитов
----------------------------------------------------------
Клиент Год Месяц Лимит
1 2002 07 $100
2 2002 04 $200
2 2002 05 $150
3 2001 12 $300
3 2002 06 $400
-----------------------------------------------------------
Есть табличка которую нужно заполнить действующим на данный год и месяц значением
----------------------------------------------------------
Клиент Год Месяц Лимит($)
1 2002 07
2 2002 06
3 2002 05
-----------------------------------------------------------
Результат должен быть следующим
----------------------------------------------------------
Клиент Год Месяц Лимит($)
1 2002 07 100
2 2002 06 150
3 2002 05 300
-----------------------------------------------------------
Можно ли это сделать одним Update. То есть для каждого клиента из справочника выбрать дату равную или меньшую
той что в исходной таблице. Заранее благодарен.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047501
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select
t2.part_code
, t2.YEAR_NUMBER*100+t2.MONTH_NUMBER
,max(t1.LIMIT_YEAR*100+t1.LIMIT_MONTH)
from t2 join t1
on t2.part_code = t1.part_code and (t2.YEAR_NUMBER*100+t2.MONTH_NUMBER)>=(t1.LIMIT_YEAR*100+t1.LIMIT_MONTH)
group by
t2.part_code
, t2.YEAR_NUMBER*100+t2.MONTH_NUMBER
-----------------------------------------------
t1 - справочник
t2 - исходная таблица
-----------------------------------------------
Так я могу найти для каждого клиента дату лимита,
но как для этой даты и этого клиента взять сумму лимита
и засунуть ее UPDAt ом в исходную таблицу? Хотелось бы все это сделать ОДНИМ оператором.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047539
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO так немного попроще будет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
set nocount on
create table #t1(client_id int, limit_year char( 4 ), limit_month char( 2 ), limit_value decimal( 10 , 2 ))
insert #t1 values( 1 , '2002', '07',  100  )
insert #t1 values( 2 , '2002', '04',  200 ) 
insert #t1 values( 2 , '2002', '05',  150  )
insert #t1 values( 3 , '2001', '12',  300  )
insert #t1 values( 3 , '2002', '06',  400  )

create table #t2(client_id int, limit_year char( 4 ), limit_month char( 2 ))
insert #t2 values( 1 , '2002', '07')
insert #t2 values( 2 , '2002', '06') 
insert #t2 values( 3 , '2002', '05')

select *, 
(select top  1  limit_value from #t1 b 
     where b.client_id = a.client_id and 
         b.limit_year+b.limit_month <= a.limit_year+a.limit_month order by b.limit_year+b.limit_month desc) as limit_value,
(select top  1  limit_year from #t1 b 
    where b.client_id = a.client_id and 
        b.limit_year+b.limit_month <= a.limit_year+a.limit_month order by b.limit_year+b.limit_month desc) as limit_year2,
(select top  1  limit_month from #t1 b 
    where b.client_id = a.client_id and 
        b.limit_year+b.limit_month <= a.limit_year+a.limit_month order by b.limit_year+b.limit_month desc) as limit_month2
from #t2 a 

drop table #t1
drop table #t2


Но если вы пересмотрите вашу схему данных, а именно добавите первичный ключ в "Справочник лимитов", то реализация подобных ( а может и вообще всех запросов) станет куда как проще
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
set nocount on
create table #t1(t1_record_id int identity, client_id int, limit_year char( 4 ), limit_month char( 2 ), limit_value decimal( 10 , 2 ))
insert #t1 values( 1 , '2002', '07',  100  )
insert #t1 values( 2 , '2002', '04',  200 ) 
insert #t1 values( 2 , '2002', '05',  150  )
insert #t1 values( 3 , '2001', '12',  300  )
insert #t1 values( 3 , '2002', '06',  400  )

create table #t2(client_id int, limit_year char( 4 ), limit_month char( 2 ))
insert #t2 values( 1 , '2002', '07')
insert #t2 values( 2 , '2002', '06') 
insert #t2 values( 3 , '2002', '05')

select *
from
(select a.client_id, a.limit_year, a.limit_month, max(b.t1_record_id) as t1_record_id
from #t2 a
left outer join #t1 b on b.client_id = a.client_id and b.limit_year+b.limit_month <= a.limit_year+a.limit_month
group by a.client_id, a.limit_year, a.limit_month
) AS a
left outer join #t1 b on b.t1_record_id = a.t1_record_id

drop table #t1
drop table #t2


А при наличии индексов производительность еще более возрастет
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047550
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо. До даты добрались. Может и до значения лимита как нибудь... с помощью энтой даты и кода клиента. И хотелось бы этот лимит засунуть в исходную таблицу.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047553
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, поторопился, спасибо.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047640
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GLORY
К сожалению второй вариант не имеет стопроцентной надежности если лимиты будут вводиться с пропусками месяцов (а это вполне возможно), а потом пользователь (если не запретить (а запретить возможно будет и нельзя)) введет в пропуск еще одну запись. Например; март, май, а потом апрель! Я считаю что вместо identity все же лучше использовать уникальный сурогатный ключ из года и месяца.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047681
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен.
Можно использовать более дорогостоящий запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select *
from
(select a.client_id, a.limit_year, a.limit_month,
   (select top  1  b.t1_record_id from #t1 b 
       where b.client_id = a.client_id 
            and b.limit_year+b.limit_month <= a.limit_year+a.limit_month 
    order by b.limit_year+b.limit_month desc
    ) as t1_record_id
from #t2 a
) AS a
left outer join #t1 b on b.t1_record_id = a.t1_record_id


Можно конечно использовать и составной первичный ключ (только он все таки будет клиент+год+месяц). Только такой ключ IMHO потребует б`ольших затрат на программирование

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select *
from
(select a.client_id, a.limit_year, a.limit_month, max(cast(b.client_id as char( 10 ))+b.limit_year+b.limit_month) as t1_record_id
from #t2 a
left outer join #t1 b on b.client_id = a.client_id and b.limit_year+b.limit_month <= a.limit_year+a.limit_month
group by a.client_id, a.limit_year, a.limit_month
) AS a
left outer join #t1 b on cast(b.client_id as char( 10 ))+b.limit_year+b.limit_month = a.t1_record_id


Что для вас лучше - решать вам.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047690
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047721
Voland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GLORY
Прежде чем к году прибавить месяц, я его умножаю на 100.
Иначе если в t2 - январь 2002, а в справочннике - декабрь 2001 - ошибка.
...
Рейтинг: 0 / 0
Можно ли updat - ить не использую курсора и #tmp
    #32047728
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы заметили, что в моем примере поля Год и Месяц - символьные. Поэтому никаких проблем нет. Можете убедиться на примере клиента 3 (для '2002', '05' из t2 извлекается '2001', '12', 300 из t1)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли updat - ить не использую курсора и #tmp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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