ورود

View Full Version : آپدیت یک رکورد با استفاده از فیلدهای رکورد قبلی



mehdi mahbobi
سه شنبه 13 اردیبهشت 1390, 11:45 صبح
سلام دوستان . من در جدولم نیاز دارم تا هر رکورد را با استفاده از فیلدی که در رکورد قبلش قرار داره ( با انجام یک سری محاسبات) آپدیت کنم کسی میوتنه راهنمایی ام کنه ؟

m_omrani
سه شنبه 13 اردیبهشت 1390, 13:18 عصر
با كرسر مي‌شه اين كار رو كرد. اما به عنوان آخرين راه بهش نگاه كنيد.

m_omrani
سه شنبه 13 اردیبهشت 1390, 19:29 عصر
من يه كوئري نمونه نوشتم. امتحان كنين، جواب مي‌ده:

create table #mytable
(
ID int identity(1,1) primary key,
c1 char(2),
c2 int
)

insert into #mytable(c1,c2) values('AF',10)
insert into #mytable(c1,c2) values('CG',12)
insert into #mytable(c1,c2) values('BQ',24)
insert into #mytable(c1,c2) values('RU',16)
insert into #mytable(c1,c2) values('DI',37)
insert into #mytable(c1,c2) values('AT',22)
insert into #mytable(c1,c2) values('ME',18)
insert into #mytable(c1,c2) values('YH',35)
insert into #mytable(c1,c2) values('KO',18)
insert into #mytable(c1,c2) values('JH',29)
insert into #mytable(c1,c2) values('DS',30)
insert into #mytable(c1,c2) values('LP',27)

select * from #mytable

update #mytable set c2 = q.c2
from
(
select mt1.ID,q2.c2
from #mytable mt1
inner join
(
select row_number() over(order by ID) as Row,ID from #mytable
) q1 on mt1.ID = q1.ID
inner join
(
select row_number() over(order by ID) as Row,c2 from #mytable
) q2 on q1.row = q2.row - 1
) q
inner join #mytable mt on mt.ID = q.ID

select * from #mytable

drop table #mytable


ابتدا يه جدول نمونه به نام mytable با سه ستون ID (كليد)، c1 از نوع char(2) و c2 (int) ايجاد مي‌شه.
بعد تعدادي ركورد نمونه در اون درج مي‌شه.
بعد ستون c2 تمامي ركوردها بر اساس مقدار ركورد قبل به روز رساني مي‌شه.

محمد سلیم آبادی
سه شنبه 13 اردیبهشت 1390, 20:12 عصر
خب،
راه حلی که در پست قبلی ارائه داده شده استاندارد هست. ولی باید دقت داشته باشین که ROW_NUMBER در نسخه 2005 معرفی شده و ممکنه دنبال راه حل استاندارد portable ای باشین که در تمام نسخه ها قابل اجرا باشه. پس اینجا رو ببینید
http://www.30sharp.com/article/13/307/11/%d9%85%d8%aa%d8%b5%d9%84-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%a7%d8%af%d9%87-%d9%87%d8%a7%db%8c-%d9%82%d8%a8%d9%84%db%8c-%d9%88-%d8%a8%d8%b9%d8%af%db%8c-%d8%a8%d9%87-%d8%b3%d8%b7%d8%b1-%d8%ac%d8%a7%d8%b1%db%8c.aspx

محمد سلیم آبادی
سه شنبه 13 اردیبهشت 1390, 22:18 عصر
من يه كوئري نمونه نوشتم. امتحان كنين، جواب مي‌ده:

create table #mytable
(
ID int identity(1,1) primary key,
c1 char(2),
c2 int
)


update #mytable set c2 = q.c2
from
(
select mt1.ID,q2.c2
from #mytable mt1
inner join
(
select row_number() over(order by ID) as Row,ID from #mytable
) q1 on mt1.ID = q1.ID
inner join
(
select row_number() over(order by ID) as Row,c2 from #mytable
) q2 on q1.row = q2.row - 1
) q
inner join #mytable mt on mt.ID = q.ID

select * from #mytable

drop table #mytable


ابتدا يه جدول نمونه به نام mytable با سه ستون ID (كليد)، c1 از نوع char(2) و c2 (int) ايجاد مي‌شه.
بعد تعدادي ركورد نمونه در اون درج مي‌شه.
بعد ستون c2 تمامي ركوردها بر اساس مقدار ركورد قبل به روز رساني مي‌شه.

1. وقتی امکان استفاده از Row_number وجود داره حتما امکان استفاده از cte هم وجود داره پس با کمک cte از نوشتن دوبار row_number صرف نظر می کنیم.
2. نیازی نیست که سه بار جدول با خودش اتصال پیدا کنه 2 بار کافیه، فقط باید لیست ستون های مورد نیاز رو انتخاب کنید.
3. وقتی نام مستعار میدین به جدولی که میخواد updateبشه از همون نام مستعار می تونید جلوی update استفاده کنید.

یعنی:

;with c1 as
(
select row_number() over(order by ID) as Row, * from #mytable
), c2 as
(
select q1.id, q2.c2
from c1 q1
left join c1 q2
on q1.row = q2.row - 1
)

update mt
set c2 = q.c2
from c2 q
join #mytable mt o
n mt.ID = q.ID;