PDA

View Full Version : نحوه نوشتن یک INSERT پیچیده



morika
چهارشنبه 04 مرداد 1391, 19:01 عصر
سلام
می خوستم ببینم همچین کد insert ی رو چجوری میشه نوشت
من 2تا table دارم تو بانکم که عینا مثل هم هستن والبته ستونهای زیادی هم دارن
یه دستور insert می خوام که داده هایی که تو table2 هستن و تو table1 نیستن رو از table2 کپی کنه تو table1 و اگه داده ای تو هردو table بود بره سواغ فیلد date و ببینه که اگه date رکوردی که تو table1 هست کوچیکتر از مقدار فیلد date در table2 هست؛ رکورد موجود در table1 رو به رکورد table2، آپدیت کنه.
خودم که هرکاری کردم نشد.
ممنون

baktash.n81@gmail.com
پنج شنبه 05 مرداد 1391, 12:04 عصر
خوب فرض می کنیم F1 کلید اصلی جدول T1 و F2 کلید اصلی جدول T2 باشه ...

قسمت اول :


INSERTINTO T1
(F1,....)
SELECT
(F2,....)

FROM T2 WHERE F2 Notin(SELECT F1 FROM T1)

baktash.n81@gmail.com
پنج شنبه 05 مرداد 1391, 12:12 عصر
اینم قسمت UPDATE


UPDATE [FST].[dbo].[DocumentList]
SET T2.[DATE] = T1.[DATE]

FROM T2 JOIN T1 ON F2=F1
WHERE
F2 IN (SELECT F1 FROM T1) AND T1.DATE<T2.DATE



البته اگه قرار بود این کد توی برنامه من زیاد اجرا نشه ... مثلا هفته ایی یک بار این اتفاق بیفته ... من ترجیح می دادم از CURSOR استفاده کنم ... اونجا یکم کنترلم بیشتره ... اما اگه تعداد رکوردها زیاد باشه دیگه هفته ایی یه بار هم جواب نمی ده ... چون خود کرسر ممکنه اجرا شدنش بیشتر از یک هفته طول بکشه ... اما اگه توضیح بدی این کار برای چی هست شاید دوستان راه حل های بهتری هم ارائه بدند ...

morika
پنج شنبه 05 مرداد 1391, 15:37 عصر
با تشکر از جوابهای شما آقای بکتاش. یه مشکل جدید برای من پیش اومده که مجبور شدم از دوتا بانک استفاده کنم. و از اونجایی که گفتین بری چی می خوام حالا کامل توضیح میدم که راهنماییم کنین.
تو برنامه 2تا بانک هست. یکی به صورت local روی سیستم کاربر و یکی آپلود شده روی هاست. هردو بانک عینا مثل هم هستن. حالا وقتی کاربر می خواد بانک local رو آپدیت کنه برنامه باید table host رو چک کنه و اگه رکوردی توش بود که تو table local نبود او رکورد رو دانلود کنه و به table local اضافه کنه. همه رکوردها دارای یه فیلد کلیک و یه فیلد تاریخ date هستن که مشخص می کنه آخرین بار کی آپدیت شدن. حالا وقتی یه رکورد تو table host باشه و تو table local هم باشه برنامه باید به فیلد date رجوع کنه و اگه تاریخ رکورد table host بزرگتر از تاریخ table local بود او رکورد رو تو table local آپدیت کنه.
این کاریه که من می خوام انجام بدم البه با دستورات #C انجامش دادم اما هم کد طولانی تری شد هم خیلی پیچیده. فکر کنم بشه همه اینکارارو با دستورات خود sql انجام داد بخاطر همین این سوال رو پرسیدم.
ممنون

baktash.n81@gmail.com
شنبه 07 مرداد 1391, 13:26 عصر
اگه بخواین این کار رو توی سطح دیتابیس انجام بدید ... باید سرور ها بتونن همدیگرو ببینن ... توی سرور Local یه LinkServer به سرور اصلی ایجاد کنید ... بعد توی کدتون هر جا می خواین از جدول اصلی استفاده کنید اسم سرور رو هم اضافه کنید ...
ولی فکر نکنم هیچ تضمینی وجود داشته باشه که این کار سریعتر باشه ...ضمن اینکه نوشتن کد توی لایه برنامه مدیریت خطا راحت تر هست ... و این کدی که من نوشتم برای اجرا شدن توی هر بار که کاربر می خواد اطلاعات رو ببینه یا ذخیره کنه خیلی سنگینه ...