PDA

View Full Version : مشکل در UpDate



Mahdi_20
یک شنبه 21 آبان 1385, 10:08 صبح
من یه جدول با مقادیر زیر دارم:

Field1 - Field2
1 - 1
2 - 2
3 - 1
4 - 1
5 - 2
6 - 2
7 - 1
البته این جدول اطلاعات بیشتری داره. Field2 همیشه از 1 شروع میشه تا بی نهایت
من می خوام سطرهایی که Field1 اون برابر با 2 هست رو Delete کنم..
جدول باید Update بشه.. و Field2 از 1 و2 و3 و ...

راه حل شما چیه؟

sarvestan
یک شنبه 21 آبان 1385, 10:37 صبح
استفاده از trigger ها!

Mahdi_20
یک شنبه 21 آبان 1385, 10:40 صبح
اگه میشه بیشتر توضیح بدین.. ممنون میشم

majid325
یک شنبه 21 آبان 1385, 11:53 صبح
من می خوام سطرهایی که Field1 اون برابر با 2 هست رو Delete کنم..
راه حل شما چیه؟

DELETE Tb_Name WHERE Field1=2

ولی اگر منظورت از 2 فیلد 2 بود:

DELETE Tb_Name WHERE Field1=Field2

Mahdi_20
یک شنبه 21 آبان 1385, 13:18 عصر
دستتون درد نکنه..
ولی من تو Update مشکل دارم..
شما زحمت کشیدی حذفشون کردی.. تو Update کردن Field2 (از 1 تا ...)
چه راه حلی پیش نهاد می کنین

majid325
یک شنبه 21 آبان 1385, 13:31 عصر
متوجه سئوالتون نشدم....ولی اینم دستور Update :

UPDATE MyTb SET Field1=Value1,Field2=Value2

Field که فیلد و Value مقداری که باید تو فیلد بشینه.

حالا اگه خواستی میتونی این Value را با یک متغییر به کوئری پاس بدی.

Mahdi_20
یک شنبه 21 آبان 1385, 13:37 عصر
آقا جان من شکل دستور رو بلدم..
من دارم دنبال یه راه حل برای مشکلم میگردم..
شما اصلا صورت مسئله رو خوندی؟

majid325
یک شنبه 21 آبان 1385, 13:56 عصر
لطفا شما هم پست ها را خوب بخونید


متوجه سئوالتون نشدم.....

اگه نمیگی "آقا جان من شکل دستور رو بلدم" !

UPDATE MyTb SET Field1=' ',Field2=' ' WHERE Field1=2

اگه اینم نبود که سئوالتو خیلی بد پرسیدی!

Mahdi_20
یک شنبه 21 آبان 1385, 14:05 عصر
لطفا بعد از اینکه اونو خوندین یه ذره روش فکر کنید..
من او سطر هایی از Feild1 رو که می خوام حذف میکنم..طبیعتا ستون Field2 از 1 تا ... مرتب نیست..منظورم اینه
1,2,3,4,5,6,7,8,9,10,...
این شکل بهم میریزه یعنی میشه
1,3,4,7,9,11,13,...
چطوری می تونم این ستون را با یه دستور Update از 1 تا ... مرتب کنم

SabaSabouhi
یک شنبه 21 آبان 1385, 14:24 عصر
با سلام
این پرسش چه ربطى به این تالار داره؟ بهتره پرسش در جاى مناسب مطرح بشه.

اما یک راه حل:
از حلقه استفاده کنید.

1. کوچکترین سطر را که field1 آن برابر 2 است را پیدا کنید.
2. اگر پیدا نشد از حلقه خارج شوید.
3. مقدار field2 آن را ذخیره کنید.
4. آن سطر را حذف کنید.
5. تمام رکوردهاى جدول را که field2 آن از مقدار ذخیره بیشتر است را به شکل زیر update کنید:



Update <Table> set field2 = field2 - 1 where field2> @myField2


6. حلقه را از ابتدا تکرار کنید.

البته توجه داشته باشید که استفاده از حلقه اصولاً روش خوبى نیست و بسیار هم کند است، اما مشکل شما را حل مى‌کند.

صبا صبوحى

Mahdi_20
یک شنبه 21 آبان 1385, 14:33 عصر
البته که مشکل حل نمیشه...
عزیزان یه تست کوچیک تو یه کاغذ بزنن .. میبینید که به این راحتی هم نیست.
البته , من می خوام با یه دستور این کار رو انجام بدم.
--------------------
آخه ممکنه بعضی وقتها 2,3,4 و ... از Field2 کم بشه

majid325
یک شنبه 21 آبان 1385, 14:56 عصر
همان طور که یکی از دوستان اشاره کردن شما باید از تریگیر استفاده بکنی ؟

Mahdi_20
یک شنبه 21 آبان 1385, 15:13 عصر
منم خواهش کردم در موردش توضیح بدن..

sarvestan
یک شنبه 21 آبان 1385, 15:37 عصر
:: در سایت اگر جستجو می کردید خیلی سریع تر به جواب می رسیدید ::
اینجا رو ببینید برای تریگرها (http://barnamenevis.org/forum/showthread.php?t=51289)
کافی بود تنها کلمه ای رو که بهتون گفتم رو در سایت جستجو کنید" triger " تا معطل نشوید

برای اطلاعات بیشتر جستجو را در سایت پیشنهاد می کنم!
تریگر - trigger

Mahdi_20
دوشنبه 22 آبان 1385, 06:55 صبح
خوب حالا می تونم بگم که triger هم به دردم نخورد..
آخه تا جایی که من فهمیدم با انجام یک فعالیت روی Table می تونیم یه کار انجام بدیم..مثالا بعد از حذف فلان کار انجام بشه..
ولی این مشکل منو حل نمیکنه..من فقط یه دستور Update میخوام بنویسم که ستون field2 من رو از 1 تا ... پر کنه.

sarvestan
دوشنبه 22 آبان 1385, 10:32 صبح
خب یک کار راحتی که می تونید بکنید اینه که در تریگر بعد از update این رکورد چندم در بانکتونه و فقط شماره همون رکوردتون رو در فیلد مربوطه بنویسید!


یا استفاده از یک متغیر در یک stroeprocedure و مقدار دادن هر لحظه اون متغیر در داخل حلقه! ( یک کمی هم به cursor نیاز داری :چشمک: )

Mahdi_20
دوشنبه 22 آبان 1385, 10:56 صبح
هاااااااااااااااااااااااا ااااا ایییییی Cursor چیه؟

sarvestan
دوشنبه 22 آبان 1385, 11:27 صبح
Cursor یا کرسر را در سایت جستجو کنید

SabaSabouhi
دوشنبه 22 آبان 1385, 16:00 عصر
البته که مشکل حل نمیشه...
عزیزان یه تست کوچیک تو یه کاغذ بزنن .. میبینید که به این راحتی هم نیست.
البته , من می خوام با یه دستور این کار رو انجام بدم.


با سلام
مطمئن باش که مشکلت حل مى‌شه. امتحان کن و نتیجه رو ببین.
این که مى‌خواهى با یک دستور باشه کارى نداره. کافیه براى این کار یک Stored Procedure بسازى و این کارها رو اون تو انجام بدى.

راستى چون چند عمل رو دارى به صورت پیاپى انجام مى‌دى باز و بسته کردن Transaction یادت نره.

صبا صبوحى

Mahdi_20
سه شنبه 23 آبان 1385, 06:47 صبح
Update <Table> set field2 = field2 - 1 where field2> @myField2



منظور من اینه بود که با این دستور.. مشکل حل نمیشه
ولی فکر کنم با همون Cursorها بشه یه کاری کرد.

SabaSabouhi
سه شنبه 23 آبان 1385, 17:37 عصر
منظور من اینه بود که با این دستور.. مشکل حل نمیشه
ولی فکر کنم با همون Cursorها بشه یه کاری کرد.

با سلام
دوست عزیز، حل مى‌شه. شما امتحان کن، اگه نشد با من.
اون حلقه براى همین هست. وقتى شما اولین سطر رو براى حذف پیدا مى‌کنید تمام سطرهاى بعدى باید فقط یکى ازشون کم بشه. اگه سطر دیگرى براى حذف پیدا شد باز به همین ترتیب.
من این کار رو قبلاً انجام داده‌ام و هیچ مشکلى نداره.

حتماً امتحانش کن (به امتحانش که مى‌ارزه)

صبا صبوحى

Mahdi_20
چهارشنبه 24 آبان 1385, 14:06 عصر
عزیزم..ممنونم که به مسائل جوانان رسیدگی میکنین.. مثل اینکه شما متوجه نیستیااااااا...من دونه دونه از جدول حذف نمی کنم..
با یه دستور دو سه هزار رکورد ممکنه حذف بشه..خاطر نشان کنم که، این رکورد ها به ترتیب حذف نمیشن..
فرض کنید. در ابتدا سطرهام مرتب باشه و با یه دستور حذف خانه های 1 و 3و 4 و6و7 و9 پاک بشه..حالا باید از مقدار خانه شماره 2 یکی کم بشه (تا مقدارش 1 بشه) و از پنجمی 3 کم بشه (تا مقدارش 2 بشه) ..
ولی شما تو این دستور یکی از تمام سطرها کم می کنی.

بهترین راه حلی که به ذهنم میرسه اینه که تمام سطرهای این ستون رو دوباره مقدار دهی کنم..ولی دستورش رو نمی دونم.

بازم متشکرم...اگه راه حل بهتری به ذهنتون میرسه..لطف کنید منو در جریان بزارین

sarvestan
چهارشنبه 24 آبان 1385, 16:21 عصر
این کدی که صبا پیشنهاد داده را در تریگر بعد از آپدیت after update بنویسی درست عمل میکند!(همون چیزی که میخواهی)
ولی یه مشکل کوچولو داره!
خیلی Process میبره! :متفکر:

Mahdi_20
پنج شنبه 25 آبان 1385, 06:56 صبح
خوب دادا.. منم که گفتم اصلا خیلی کارا میشه کرد..
من میخوام بهترین کار رو انجام بدم..با کمترین Process

SabaSabouhi
شنبه 27 آبان 1385, 16:49 عصر
فرض کنید. در ابتدا سطرهام مرتب باشه و با یه دستور حذف خانه های 1 و 3و 4 و6و7 و9 پاک بشه..حالا باید از مقدار خانه شماره 2 یکی کم بشه (تا مقدارش 1 بشه) و از پنجمی 3 کم بشه (تا مقدارش 2 بشه) ..
ولی شما تو این دستور یکی از تمام سطرها کم می کنی.

با سلام
دوست من، پس حلقه چى؟ اون حلقه براى اینه که تمام رکوردهاى لازم حذف بشن.
درسته که روش کندى هست، اما تو درست بودنش شک نکن.



بهترین راه حلی که به ذهنم میرسه اینه که تمام سطرهای این ستون رو دوباره مقدار دهی کنم..ولی دستورش رو نمی دونم.


بله، این هم روش خوبیه اما خود من هم چیزى پیدا نکردم. البته اگه اصرار نداشته باشید که این کار رو از طریق فرامین SQL انجام بدید راه حل دیگه‌اى هم هست.
تو ADO.NET یه DataTable رو با این جدولتون پر کنید. سطرهایى رو که مى‌خواهید حذف کنید
بعد یک حلقه for خوشگل اون field شما رو با اعداد پیایى پر مىکنه و بعد کافیه که DataBase رو Update کنید. (البته من خودم روش اول رو ترجیح مى‌دم.)

صبا صبوحى