View Full Version : کار با دستور Insert Into در SQl
hadisalahi2
جمعه 13 آذر 1388, 12:36 عصر
با سلام به همگی دوستان.
من دوتا جدول دارم که میخوام با دستور Insert into از یک جدول داده ها را Select کرده و داخل جدول دوم بریزم.
مثلا در صورتی که تعداد فیلدها در جداول برابر یا متفاوت باشد میتوان به سادگی با دستور زیر این کار را انجام داد.
insert into Bridgetable select ID,Name,Len,Width from TempTable
اما این دستور برای زمانی کار میکنه که مقادیر داخل جدول اول قرار دارند و به راحتی در صورت هم خوانی نوع فیلدها در جدول دوم درج میگردد.
اما سوال من اینه که چطور میشه داده ها رو همراه به Select و به صورت متغیر در جدول دوم درج نمود.
توضیح جداول به صورت زیر است:
جدولی که قراره داده ها در داخل اون درج بشه دارای فیلدها : کد- تاریخ، نوع،تعدادو شرح است.
اما جدولی که قراره داده ها از اون Select بشه ، فقط فیلدهای کد و تعداد رو داره.
حالا تاریخ ، نوع و شرح رو من داخل متغیر های جداگانه دارم و میخوام همزمان در این جدول به همراه فیلدهای کد و تعداد درج شود.
این کار در sqL قابل انجامه چون قبلا در درس پایگاه داده این کار ها رو زیاد انجام دادیم .
ولی الان دیگه با گذشت چندین سال فراموش کردم
ممنون میشم دوستان و اساتید راهنمایی کنند.
یا حق
merced
جمعه 13 آذر 1388, 13:30 عصر
insert into Bridgetable (ID , Name , 0 , 'Comment') select ID,Name,Len,WidthString from TempTable
hadisalahi2
جمعه 13 آذر 1388, 17:26 عصر
دوست عزیز با تشکر ولی شما منظور من رو متوجه نشدید.
در جدول BridegTabel ما 5 تا فیلد دارم . فرضا ، کد، تاریخ، نوع،تعداد و شرح.
اما در جدول TempTable ما دو تا از این فیلدها رو داریم. فقط کد و تعداد رو.
حالا چگونه مقادیر تاریخ و نوع و شرح رو همراه با دستور Select در جدول BridgeTable درج کنم.
حالا یا به هر روش و دستوری که بشه این کار رو انجام داد.
در ضمن شما فرض کن تاریخ در متغیر Dates ، نوع در متغیر Types و شرح هم در متغیر Desc می باشد.
یا حق
merced
جمعه 13 آذر 1388, 19:42 عصر
خوب اگه نوع و شرح رو از كجا مي خواي بياري . اگه ميتوني با يه query جدول Temp رو بسط بدي كه نوع و شرح رو بياره خوب Select رو از اون كوئري انجام بده
hadisalahi2
شنبه 14 آذر 1388, 09:34 صبح
خوب اگه نوع و شرح رو از كجا مي خواي بياري . اگه ميتوني با يه query جدول Temp رو بسط بدي كه نوع و شرح رو بياره خوب Select رو از اون كوئري انجام بده
خوب اگه قرار بود این کار رو بکنم که دیگه چه کاری به دستور Insert into Select .
همین طوری یکی یکی رکوردها رو از جدول اول میخوندم و در جدول دوم درج میکرد.
هدف برای این کار سرعت بالا و عدم انجام کار اضافی در جداوله.
در ضمن تا جایی که یادم میاد می شد فیلدهای اضافی رو در یک تکنیک خاص در داخل Select گنجاند و اونها رو در داخل جدول دوم درج کرد.
من اينجور متوجه دم كه شما يه جدول داري كه 3 تا فيلدداره و دومي 2 تا فيلد مي خواي اوني رو كه سه تا فيلد داره بريزي داخل اوني كه دو تا داره ؟
نه دوست عزیز شما برعکس متوجه شدی. این حالت که کاری نداره ، فقط کافیه تعداد فیلدها رو در دستور Select به تعداد فیلدهای جدولی که قراره داده ها در اون درج بشن انتخاب کنیم.
من میخوام داده ها رو از جدولی که دو تا فیلد مشترک داره در جدولی که 4 تا فیلد داره درج کنم.
حالا دو تا فیلد رو میخوام با Select درج کنم و دو تای دیگه رو از داخل دو تا متغیر .
البته دوستان اگه روشی سریعتر و یا بهتر سراغ دارند ، معرفی کنند ممنون میشم.
یا علی
Ebrahim Asadi
شنبه 14 آذر 1388, 10:00 صبح
از Cursor استفاده كن
hadisalahi2
شنبه 14 آذر 1388, 16:04 عصر
از Cursor استفاده كن
میشه لطف کنید و راهنمایی کنید. اصلا چی هست و به چه دردی میخوره؟
benyaminrahimi
شنبه 14 آذر 1388, 19:29 عصر
کرسر برای این کار نیست وقتی از کرسر استفاده می کنیم که می خواهیم پیمایش روی رکورد ها داشته باشیم مثلا محاسبه کاردکس یک کالا از روی برگه ها
البته خود کرسر بار سنگینی رو حافظه داره
....
البتته با کرسر هم میشه انجامش داد ولی
به نظر من شما باید یک stored procedure تعریف کنید و پارامتر هایی رو که ندارید مثل تاریخ ورودی stored procedure ست کنید و دستورتون
insert into Bridgetable (ID , Name ,tarikh) select ID,Name,
@tarikh
from temptable
میشه
merced
شنبه 14 آذر 1388, 21:57 عصر
خوب اگه قرار بود این کار رو بکنم که دیگه چه کاری به دستور Insert into Select .
همین طوری یکی یکی رکوردها رو از جدول اول میخوندم و در جدول دوم درج میکرد.
هدف برای این کار سرعت بالا و عدم انجام کار اضافی در جداوله.
در ضمن تا جایی که یادم میاد می شد فیلدهای اضافی رو در یک تکنیک خاص در داخل Select گنجاند و اونها رو در داخل جدول دوم درج کرد.
قبلي اشتباه گفتم .. بايد مقادير ثابت رو تو Seclect بياري
اگه دو فيلد در جدول مقصد هست كه مي خواي مقادير ديگه اي بهش بدي
اگر مقادير ثابتند (در اينجا 0 و Comment)
insert into Bridgetable (ID , Name ,NumberFied , aString) select ID,Name,0,'Comment' from TempTable
و شما گفتي يكي يكي . من اينو نگفتم دقت كن گفتم Select ساده رو تبديل به يك query كن
به شرطي كه فيلدهايي كه كم داري از ازيك كوئري ديگه بدست مي آد
insert into Bridgetable (ID , Name ,NumberFied , aString) select * from (Selcet x , y , z, a from temp inner Join .. . va ela akhar)
hadisalahi2
یک شنبه 15 آذر 1388, 17:50 عصر
قبلي اشتباه گفتم .. بايد مقادير ثابت رو تو Seclect بياري
اگه دو فيلد در جدول مقصد هست كه مي خواي مقادير ديگه اي بهش بدي
اگر مقادير ثابتند (در اينجا 0 و Comment)
insert into Bridgetable (ID , Name ,NumberFied , aString) select ID,Name,0,'Comment' from TempTable
و شما گفتي يكي يكي . من اينو نگفتم دقت كن گفتم Select ساده رو تبديل به يك query كن
به شرطي كه فيلدهايي كه كم داري از ازيك كوئري ديگه بدست مي آد
insert into Bridgetable (ID , Name ,NumberFied , aString) select * from (Selcet x , y , z, a from temp inner Join .. . va ela akhar)
با سلام و تشکر
البته قبلا هم عرض کردم و مقادیر توضیحات و تاریخ رو در متغیر نگهداری میکنم.
حالا اینکه شما اونها رو ثابت تعریف کردید.
حالا اون دو مقدار رو آیا Select میشناسد؟
فکر نکنم نیازی به ایجاد یک کوئری پیچیده تر باشد.چون من مقادیر را دارم نیازی نیست تا اونها رو از داخل جدول دیگه بدست بیارم. اول اینکه این کار باعث بالا رفتن تعداد پردازش ها شده و همچنین در جدول ثانویه این مقادیر وجو نداره که بخوام اونها رو از جدول دیگه ای استخراج کنم.
یا حق
merced
یک شنبه 15 آذر 1388, 18:22 عصر
مقادیر توضیحات و تاریخ رو در متغیر نگهداری میکنم.
خسته نباشيد. حالا چه جوري مي خوايد با يه دستور Insert اون مقادير (كه احتمالاً براي چند ركورد هست) رو بياريد تو جدول مقصد؟؟ با پيمايش ؟
ببين ما در دو سطح مختلف كار مي كنيم. يكي تو delphi كه شما متغير دارين و يكي SQL Server
حالا چطور ميشه با يه دستور Insert Into مقادير متغير ها رو در ركوردهاي ايجاد شده توسط اين دستور ثبت كرد .. فكر نمي كنم بشه.
حسین شهریاری
دوشنبه 16 آذر 1388, 09:16 صبح
سلام
این کار شدنی است.چرا که شما توی Select میتونین مقادیر ثابت را هم استفاده کنین.پس از همین قاعده استفاده کنین.برای اطمینان بیشتر توی آنالایزر بنویسید:select 1,2,3,4,'ggggg',8 ببینید چه اتفاقی میفته؟
جواب شما دوست عزیز اینه کمی بهش ور برین و توی پروژه خودتون استفاده کنین:
adoquery.sql.text:='insert into Bridgetable select ID,'+Dates+','+Types+',Tedad,sharh from TempTable'
adoquery.ExecSql
در اصل ما اومدیم و کمبود مقادیری را که توی TempTable بوده را با مقادیر ثابت(همان متغیرهای شما) جبران کردیم
موفق باشید
hadisalahi2
دوشنبه 16 آذر 1388, 17:05 عصر
خسته نباشيد. حالا چه جوري مي خوايد با يه دستور Insert اون مقادير (كه احتمالاً براي چند ركورد هست) رو بياريد تو جدول مقصد؟؟ با پيمايش ؟
سلامت باشید.
اگه بلد بودم که سوال نمی کردم.
ببين ما در دو سطح مختلف كار مي كنيم. يكي تو delphi كه شما متغير دارين و يكي SQL Server
حالا چطور ميشه با يه دستور Insert Into مقادير متغير ها رو در ركوردهاي ايجاد شده توسط اين دستور ثبت كرد .. فكر نمي كنم بشه.
ولی من مطمئن هستم که میشه.چون قبلا این کار رو انجام دادم ولی حالا یادم نمی یاد قبلا این کار رو چطوری و با چه دستوری انجام دادم.
adoquery.sql.text:='insert into Bridgetable select ID,'+Dates+','+Types+',Tedad,sharh from TempTable'
adoquery.ExecSql
به نظر شما اینکه dates رو داخل کوتیشن قرار بدیم میتونه اون رو به عنوان متغیر شناسایی کنه؟
فکر کنم اینطوری فقط اونها رو به صورت رشته شناسایی کنه نا متغیر.
merced
دوشنبه 16 آذر 1388, 17:16 عصر
ولی من مطمئن هستم که میشه.چون قبلا این کار رو انجام دادم ولی حالا یادم نمی یاد قبلا این کار رو چطوری و با چه دستوری انجام دادم.
نميشه .. يادت هم نمياد
hadisalahi2
دوشنبه 16 آذر 1388, 19:50 عصر
نميشه .. يادت هم نمياد
اینجا جای کل کل کردن نیست.
حالا آدم اگه جواب مسئله ای رو نمیدونه ، دلیل نمیشه صورت مسئله رو پاک کنه
بهتره شما با ذکر یک صلوات بیخیال بشی.
خودم دارم سعی میکنم و صددرصد روشش رو پیدا میکنم.
در ضمن از سایر دوستان هم تقاضای راهنمایی دارم.
یا علی
merced
دوشنبه 16 آذر 1388, 21:27 عصر
كل كل نيست و اگه يه خورده به ساختار Insert Into نيگاه كني مي بيني كه نميشه از يه جدول فقط دو فيلدش رو Select كني و در دو فيلد از جدول مقصد بذاري و اون دو فيلد جدول مقصد مقادير متغير داشته باشند
شما هم كه مي گي اين متغيرها رو تو دلفي داري . پس بايد تو يه آرايه اي چيزي باشه.
ظاهراً نميشه .
البته درسته كه كار نشد نداره . ولي شما يه كد يا يه برنامه با ورودي بذار، اساتيد كمك كنند خروجي دلخواه شما رو توليد كنند . شايد من هم كه بد متوجه منظورتون شدم يه چيزي درك كردم.
حسین شهریاری
سه شنبه 17 آذر 1388, 09:07 صبح
سلام
دوست گرامی آقای salahi اگه دو مقدار بالا(Dates,Type)رشته ای هستند حق باشما هست،من فراموش کردم اونا را توی سینگل کوتیشن قرار بدم.کد بالا را اصلاح و باز نویسی میکنم.
ضمنا از شما تشکر میکنم که اینقدر با جنبه هستید...!!!.!!!!
adoquery.sql.text:='insert into Bridgetable select ID,'+Quotedstr(Dates)+','+Quotedstr(Types)+',Tedad ,sharh from TempTable'
adoquery.ExecSql
موفق باشید
-------------------------------------------------------------------
جهان به تلاش پاداش میدهد نه به بهانه...
یا علی
hadisalahi2
سه شنبه 17 آذر 1388, 10:40 صبح
adoquery.sql.text:='insert into Bridgetable select ID,'+Quotedstr(Dates)+','+Quotedstr(Types)+',Tedad ,sharh from TempTable'
با سلام
کد شما رو هنوز تست نکردم ولی فکر کنم دیگه به اون کوتیشن ها دیگه نیازی نباشه.
چون تابع Quotedstr خودش این کار رو انجام میده
یا علی
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.