View Full Version : استخراج رکوردهای غیرمشترک دو جدول
ENG_COM1979
چهارشنبه 12 تیر 1387, 12:41 عصر
سلام
دوتا جدول اسکیوال دارم tbl_kol و tbl_use
فیلدهای tbl_kol: name - id-emtiaz-
فیلدهای tbl_use:us_name -usid-usdate
در جدول کل اطلاعات کلیه پرسنل آمده است
در جدول دومی تعدادی از رکوردهای جدول قبل آمده است.
ابتدا مجبورم در جدول دوم جستجو انجام بدم بعد رکوردهای حاصل رو از جدول کل حذف کنم و نتیجه رو نمایش بدم.
جدول جدید ایجاد کردم به نام Temp که تمام فیلدهاش مشابه جدول tbl_kol می باشد.
و از دستور minus کمک گرفتم به این ترتیب
ADOQuery1.SQL.Add('select name from tbl_kol minus select name from tbl_temp');
اولا اینکه رکوردهای حاصل از جستجو را که می بایست از کل کسر کند و در جدول نتیجه نمایش دهد از جدول اصلی که tbl_use هست هم حذف می کند. و در dbgrid متصل به جدول Temp فقط name مشاهده می شود.
من میخوام اطلاعات tbl_use و kol دستخورده باقی بمونه و رکورد های باقی مانده در dbgrid متصل به temp با تمام فیلدهاشون مشاهده بشن.
Hsimple11
چهارشنبه 12 تیر 1387, 14:55 عصر
یک راه این است که تمامی رکوردهای دو جدول خود را در یک جدول با هم Join کنید و بعد
جهت عدم نمایش رکورهای مشابه و تکراری از دستور Distinct استفاده کنید :
Select Distinct MyField From MyTable
موفق باشید...
ENG_COM1979
شنبه 15 تیر 1387, 10:25 صبح
فیلدهای دو جدولم مشابه نیستند ها. یکی از جدول ها فیلدهای بیشتری داره. مشکلی پیش نمیاد؟
ENG_COM1979
شنبه 15 تیر 1387, 12:40 عصر
من دوتا جدول دارم که فیلد name_family توی هر دو وجود دارد می خوام محتوای این دو جدول رو با توجه به پیشنهاد hsimple11 با همدیگر join کنم و در جدول سومی قرار بدم جهت Distinct کردن . می شه دستور مربوطه رو واسم بنویسید. سرچ کردم اما نتونستم چیزی پیدا کنم.
ممنون
Hsimple11
شنبه 15 تیر 1387, 17:35 عصر
کلمات کلیدی JOIN و UNION در SQL:
برای انتخاب اطلاعات از دو یا چند Table چند راه وجود دارد :
1- استفاده از دستور SELECT و ارجاع آن به چند جدول مورد نظر. مثال برای دو جدول :
SELECT Table1.Filed1,Table2.Field2 FROM Table1,Table2
اگر فیلدهایمان در دو جدول مشترک نباشند نیازی به آوردن نام Table در ابتدای فیلد نمی باشد :
SELECT Field1,Field2 FROM Table1,Table2
2- روش مناسبتر ارتباط پایگاه ها استفاده از کلمه کلیدی JOIN می باشد.
این Keyword خود انواع مختلفی دارد :
الف ) INNER JOIN : در صورت استفاده از این کلمه تمامی ردیفها در صورتی که همتایی در جدول دیگر داشته باشند نمایش داده میشوند. در واقع اگر به ازای هر ردیف در جدول اول یک ردیف در جدول دوم داشته باشید این ردیف ها با استفاده از INNERJOIN به هم ملحق شده و نمایش داده میشوند اما در غیر اینصورت خیر. مثال برای دو جدول :
ُ
SELECT Field1,Field2,... FROM Table1 INNER JOIN Table2
ON Table1.KeyField = Table2.KeyField
ب) LEFT JOIN : این دستور محدودیت INNER JOIN را نداشته و تمامی ردیفهای جدول اول "حتی اگر همتایی در جدول دوم نداشته باشند" را نمایش می دهد. مزیت INNER JOIN به LEFT JOIN سرعت بیشتر آن است. مثال :
ُSELECT Field1,Field2,... FROM Table1 LEFT JOIN Table2
ON Table1.KeyField = Table2.KeyField
پ) RIGHT JOIN : برعکس LEFT JOIN است یعنی تمامی ردیفهای جدول دوم "حتی اگر همتایی در جدول اول نداشته باشند" را نمایش می دهد.
3- کلمه کلیدی دیگری که در SQL به منظور انتخاب از چند پایگاه بکار میرود UNION است. UNION مشابه JOIN عمل میکند با این تفاوت که در هنگام استفاده از UNION باید توجه داشت که تمامی فیلدها از پایگاه های مختلف حاوی یک نوع داده باشند.
مشخصه اصلی UNION این است که علاوه بر انتخاب رکوردها از چند پایگاه، تنها داده های غیر شبیه و مجزا (Distinct) و نه تکراری را لیست میکند. در واقع UNION کار کلمه DISTINCT را هم انجام میدهد. مثال :
SELECT Field1 FROM Table1 UNION Field1 FROM Table2
نتیجه این دستور کل رکوردهای فیلد1 در هر دو جدول خواهد بود و داده های تکراری حذف خواهند شد.
Keyword دیگری بنام UNION ALL هم وجود دارد که مشابه روش اول است و تمام رکوردها را چه تکراری و چه غیر تکراری لیست میکند.
موفق باشید....
ENG_COM1979
دوشنبه 24 تیر 1387, 11:57 صبح
form3.ADOQuery5.SQL.Clear;
form3.ADOQuery5.SQL.Add('select tbl_persone.name_family,tbl_use.us_p_name from tbl_persone,tbl_use');
form3.ADOQuery5.Open;
دوستان کد بالا رو نوشتم که رکوردهای دوتا جدول رو join کنم و در جدول سوم قرار بدم. جدول مقصدم به ado5 وصل است اما در زمان اجرا چیزی مشاهده نم یشه در dbgrid ای که به جدول سوم متصله. کدم اشتباهه؟؟؟
Hsimple11
دوشنبه 24 تیر 1387, 14:49 عصر
دوست گرامی در پست قبل که کامل گفته شد. اگر رکوردهای شما در دو جدول مناظر است از Inner join استفاده کنید و اگر میخواهید تمامی رکوردها بدون توجه به تناظر لیست شود از Union All استفاده کنید یا Full Outer Join
دستور Select را برای Join استفاده نکنید چون به ازای هر رکورد از جدول اول تمامی رکوردهای جدول دوم را برمیگرداند.
SELECT Field1 FROM Table1 INNER JOIN Table2
ON Table1.KeyField = Table2.KeyField
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.