PDA

View Full Version : کپی نمودن بخشی از یک جدول



Ir.WebDeveloper
شنبه 16 مرداد 1389, 08:37 صبح
سلام دوستان
یک table دارم که دارای تعدادی زیادی رکورده،ابتدای هر ماه قراره بخشی از هر table که فیلد Flag اون False هست در همین جدول مجددا insert شه و Flag اون به True تغییر پیدا کنه!(تعداد رکوردهای False کمتر از True ها می باشد!)
خوب میخوام اینکار در سطح DBMS انجام بشه(با SP).اما نمیدونم چه راحی بهتر و بهینه تره؟
(اعم مشکلم اینه که یه چیزی مثله Foreach تو SQL نیاز دارم،البته اگه راه بهتری نباشه!)

ممنون دوستان.

Rocker
شنبه 16 مرداد 1389, 09:04 صبح
سلام دوستان
یک table دارم که دارای تعدادی زیادی رکورده،ابتدای هر ماه قراره بخشی از هر table که فیلد Flag اون False هست در همین جدول مجددا insert شه و Flag اون به True تغییر پیدا کنه!(تعداد رکوردهای False کمتر از True ها می باشد!)
خوب میخوام اینکار در سطح DBMS انجام بشه(با SP).اما نمیدونم چه راحی بهتر و بهینه تره؟
(اعم مشکلم اینه که یه چیزی مثله Foreach تو SQL نیاز دارم،البته اگه راه بهتری نباشه!)

ممنون دوستان.
امتحان کن نتیجه رو اینجا منعکس کن



insert into Table1 select [name],family,tel,flag from Table1 WHERE flag=0
update Table1 SET flag=1 where (flag=0)

Ir.WebDeveloper
شنبه 16 مرداد 1389, 10:03 صبح
دوست من این راهی که شما نوشتی برای زمانی درسته که در هر لحظه تنها یک رکورد با فلگ false موجود باشه!!!(که در جدول بنده ممکن تعدادش خیلی زیادتره!)
راه حل رو پیدا کردم:
به یک حلقه While ساده نیاز داریم (با Exists)که شرط مقابل اون میشه یه Select که رکوردهایی از جدول رو میاره که فلگ اونها False هستش!
حالا داخل حلقه id اولین رکورد از Query رو که تو شرط نوشتیم بدست میاریم و بعد یکبار اطلاعات رو insert میکنیم و آخر حلقه هم فلگ مربوط به id بدست آمده رو به True تغییر میدیم که دیگه در لیست جلوی While نیاد...

ممنون از پاسختون.

Rocker
شنبه 16 مرداد 1389, 11:51 صبح
دوست من این راهی که شما نوشتی برای زمانی درسته که در هر لحظه تنها یک رکورد با فلگ false موجود باشه!!!(که در جدول بنده ممکن تعدادش خیلی زیادتره!)
راه حل رو پیدا کردم:
به یک حلقه While ساده نیاز داریم (با Exists)که شرط مقابل اون میشه یه Select که رکوردهایی از جدول رو میاره که فلگ اونها False هستش!
حالا داخل حلقه id اولین رکورد از Query رو که تو شرط نوشتیم بدست میاریم و بعد یکبار اطلاعات رو insert میکنیم و آخر حلقه هم فلگ مربوط به id بدست آمده رو به True تغییر میدیم که دیگه در لیست جلوی While نیاد...

ممنون از پاسختون.


پس معلومه اصلا دستور امتحان نکردی که ببینی نتیجه اش چیه.:متعجب:
خیر دوست من این دستور روی همه ی رکوردهای با فلگ false عمل مینکه دستور پیشرفته ای هم نیست خیلی هم ابتداییه اتفاقا:چشمک:

این روشی که خودت گفتی هم شاید جواب بده ولی منو یاده راهکارهای شیخ نصر الدین میندازه.
لقمه رو دور سرت میچرخونی پسر ؟؟؟؟:بامزه:

Ir.WebDeveloper
شنبه 16 مرداد 1389, 13:33 عصر
پس معلومه اصلا دستور امتحان نکردی که ببینی نتیجه اش چیه.:متعجب:
خیر دوست من این دستور روی همه ی رکوردهای با فلگ false عمل مینکه دستور پیشرفته ای هم نیست خیلی هم ابتداییه اتفاقا:چشمک:

این روشی که خودت گفتی هم شاید جواب بده ولی منو یاده راهکارهای شیخ نصر الدین میندازه.
لقمه رو دور سرت میچرخونی پسر ؟؟؟؟:بامزه:

اول خیلی ممنونم که پاسخ دادی و به سرعت هم اینکار رو کردی.
آره ،امتحان نکرده بودم،ولی الان که امتحان کردم میگه چون نتیجه بیشتر از یک رکورد و شرط نیز وجود داره قابل انجام نیست اینم خطاش:


Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


اما حتی اکه دستور شما اجرا شه نتیجه کاملا اشتباه است چرا که بنده میخوام وقتی سطرهای جدید اضافه شد(با فلگ 0)سطرهای قدیم فلگشون به 1 تغییر پیدا کنه!نه کل سطرهای با فلگ 0 ....
(این که دیگه امتحان کردن نمیخواد، میخواد؟)

قطعا قبل از اینکه سوالی مطرح شه جستجویی هم انجام میشه،بنده تو هیچ فرومی ندیدم با یه دستور یک خطی همچین کاری انجام بشه...هر چند که دلیل بر نشدنش نیست.)
منتظر جوابتون هستم.

محمد سلیم آبادی
شنبه 16 مرداد 1389, 15:13 عصر
سلام،
راه حلی که میشه بکار گرفت استفاده از یک جدول موقت هست.
ابتدا سطرهایی که فلگشون صفر هست را در جدول موقت درج می کنید. سپس در جدول اصلی این سطرها را به فلگ 1 ست میکنید و در نهایت سطرهای موجود در جدول موقت را در جدول اصلی add می کنید. به این شکل:

select * into #temp from your_table where flag=0
update table_name set flag=1 where flag=0
insert into table_name select * from #temp

Rocker
شنبه 16 مرداد 1389, 17:41 عصر
اول خیلی ممنونم که پاسخ دادی و به سرعت هم اینکار رو کردی.
آره ،امتحان نکرده بودم،ولی الان که امتحان کردم میگه چون نتیجه بیشتر از یک رکورد و شرط نیز وجود داره قابل انجام نیست اینم خطاش:


Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
اما حتی اکه دستور شما اجرا شه نتیجه کاملا اشتباه است چرا که بنده میخوام وقتی سطرهای جدید اضافه شد(با فلگ 0)سطرهای قدیم فلگشون به 1 تغییر پیدا کنه!نه کل سطرهای با فلگ 0 ....
(این که دیگه امتحان کردن نمیخواد، میخواد؟)

قطعا قبل از اینکه سوالی مطرح شه جستجویی هم انجام میشه،بنده تو هیچ فرومی ندیدم با یه دستور یک خطی همچین کاری انجام بشه...هر چند که دلیل بر نشدنش نیست.)
منتظر جوابتون هستم.


الان متوجه دم چی میخوای
البته این دستور کار میکنه منتها این دستور رو من شبیه سازی کردم و شما باید اون رو برای جدول خودت درستش میکردی چون قیلدشاون با هم فرق دارن



سلام،
راه حلی که میشه بکار گرفت استفاده از یک جدول موقت هست.
ابتدا سطرهایی که فلگشون صفر هست را در جدول موقت درج می کنید. سپس در جدول اصلی این سطرها را به فلگ 1 ست میکنید و در نهایت سطرهای موجود در جدول موقت را در جدول اصلی add می کنید. به این شکل:

select * into #temp from your_table
insert into #temp select * from table_name where flag=0
update table_name set flag=1 where flag=0
insert into table_name select * from #temp

این روش جواب میده
البته امیدواری تو تعریف جدول موقت مشکلی نداشته باشی.
زیادم سخت نیست.

Ir.WebDeveloper
شنبه 16 مرداد 1389, 22:08 عصر
سلام،
راه حلی که میشه بکار گرفت استفاده از یک جدول موقت هست.
ابتدا سطرهایی که فلگشون صفر هست را در جدول موقت درج می کنید. سپس در جدول اصلی این سطرها را به فلگ 1 ست میکنید و در نهایت سطرهای موجود در جدول موقت را در جدول اصلی add می کنید. به این شکل:

select * into #temp from your_table
insert into #temp select * from table_name where flag=0
update table_name set flag=1 where flag=0
insert into table_name select * from #temp
ممنون از پاسختون،راهی رو که خودم در پست های بالا توضیح دادم فکر کنم بهتر باشه چون فقط از یک حلقه While استفاده میکنه(ضمن اینکه جوابه کاملا صحیح رو هم گرفتم ازش).اما در هر صورت یک راه دیگه هم از شما یاد گرفتم و به عقیده خودم بهترین راه بهینه ترین راه در کد نویسی است.
به هر حال ممنون از لطف شما.

Ir.WebDeveloper
شنبه 16 مرداد 1389, 22:17 عصر
الان متوجه دم چی میخوای
البته این دستور کار میکنه منتها این دستور رو من شبیه سازی کردم و شما باید اون رو برای جدول خودت درستش میکردی چون قیلدشاون با هم فرق دارن




این روش جواب میده
البته امیدواری تو تعریف جدول موقت مشکلی نداشته باشی.
زیادم سخت نیست.
دوست من چی رو شبیه سازی کردی مگه رباته؟دستور شما یک دستور تجمعی که بدون حلقه محاله اجرا بشه !(منتها شما طوری مطمئن برای من نوشتی که من خودمم شک کردم!)ضمنا وقتی شما یک دستور می نویسی بنده آنقدر شوت نیستم که اسمه فیلدهای شما رو تغییر نداده Query رو اجرا کنم.

در رابطه با جدول موقتم باید اینو بگم خدمتتون که هر کس معنی SP و DBMSو ... رو بدونه حتما نوشتنه یک دستور ساده ی ایجاد جدول رو هم بلد خواهد بود.
قصد بدی نداشتم فقط خواستم بگم تصور نکنید مخاطبتون همیشه قطعا تازه کاره صفر کیلومتره.(بنده قبل از پرسیدن این سوال Spمورد نظرم رو ایجاد و از اون نتیجه هم گرفته بودم،اما فکر کردم ممکنه بشه راحتر هم پیادش کرد واسه همین پرسیدم) .

محمد سلیم آبادی
شنبه 16 مرداد 1389, 23:33 عصر
ممنون از پاسختون،راهی رو که خودم در پست های بالا توضیح دادم فکر کنم بهتر باشه چون فقط از یک حلقه While استفاده میکنه(ضمن اینکه جوابه کاملا صحیح رو هم گرفتم ازش).اما در هر صورت یک راه دیگه هم از شما یاد گرفتم و به عقیده خودم بهترین راه بهینه ترین راه در کد نویسی است.
به هر حال ممنون از لطف شما.
این روشی که توسط While توضیح دادین بدلیل اینکه برای هر سطر مورد نظر سه عمل صورت می گیره، SELECT و بعد INSERT و در نهایت Update که این دو مورد آخر عملیات هزینه بر Log شدن هم دارند.
ولی در روشی که من معرفی کردم یکبار کل داده های مورد نظر در یک جدول موقت درج میشن. سپس کل داده ها با همدیگه درج یا بروز رسانی میشن و نتیجه آن هم افزایش سرعت هست (چرا که دفعات اجرای دستورات درج و بروز رسانی بسیار بسیار کمتر خواهد شد).

ویرایش:
در کدهایی که قرار داده بودم یک اشتباه کوچیک رخ داده بود که اصلاحش کردم./

Ir.WebDeveloper
یک شنبه 17 مرداد 1389, 06:53 صبح
این روشی که توسط While توضیح دادین بدلیل اینکه برای هر سطر مورد نظر سه عمل صورت می گیره، SELECT و بعد INSERT و در نهایت Update که این دو مورد آخر عملیات هزینه بر Log شدن هم دارند.
ولی در روشی که من معرفی کردم یکبار کل داده های مورد نظر در یک جدول موقت درج میشن. سپس کل داده ها با همدیگه درج یا بروز رسانی میشن و نتیجه آن هم افزایش سرعت هست (چرا که دفعات اجرای دستورات درج و بروز رسانی بسیار بسیار کمتر خواهد شد).

ویرایش:
در کدهایی که قرار داده بودم یک اشتباه کوچیک رخ داده بود که اصلاحش کردم./
کاملا حق با شماست،ممنون که منطقی شرحش دادین.حتما از این روش استفاده خواهم کرد.

Ir.WebDeveloper
یک شنبه 17 مرداد 1389, 07:38 صبح
کاملا حق با شماست،ممنون که منطقی شرحش دادین.حتما از این روش استفاده خواهم کرد.



/*

#StDt:جدول موقت
*/
BEGIN TRANSACTION


-- قراردادن رکوردهای با فلگ صفر در جدول
SELECT*INTO #StDt FROM TSTF_StationDetail WHERE Date=@OldDate And Expire=0

UPDATE TSTF_StationDetail
SET Expire=1 Where Date=@OldDate And Expire=0

-- تغییر تاریخ موجود در جدول موقت
UPDATE #StDt
SET Date=@NewDate

-- درج رکوردهای موجود در جدول موقت ،در جدول اصلی
INSERTINTO TSTF_StationDetail SELECT*FROM #StDt

DropTable #StDt

COMMIT TRANSACTION