PDA

View Full Version : استفاده از دستور case در join



karimi.ali2005
سه شنبه 16 فروردین 1390, 10:32 صبح
با سلام
من میخوام بر اساس اعدادی که در یک فیلد قرار می گیرند یک فیلد دیگر را با جداول متفاوت join کنم(مثلا اگر فیلد 1 بود با جدول x وصل(join)بشه و اگر 2 بود با y و...
آیا با دستور case میشه این کار را انجام داد و دستوری غیر از case برای این کار وجود دارد
با تشکر

محمد سلیم آبادی
چهارشنبه 17 فروردین 1390, 14:33 عصر
سلام،
بنظرم برای حل مسالتون نیاز به چنین کارهایی ندارین.
اگر مسالتون را با کمک داده های نمونه و نتیجه مورد نظر توضیح بدین تا با سناریوتون آشنا بشیم آون وقت میشه به حل مساله فکر کرد.

karimi.ali2005
چهارشنبه 17 فروردین 1390, 14:52 عصر
من یک برنامه حسابداری کوچیک درست کردم برای یک برنامه پیمانکاری ساختمان حال یه حسابداری دوبل براش نوشتم همون دفتر روزنامه حال بر اساس گروهها(کارفرما.صندوق.مصالح فروش و...) که انتخاب می کند به جدول ان گروه مثلا تمام کارفرماها میرم وکارفرما را کاربر انتخاب می کتد حال دوفیلد اطلاعات داریم یکی نشان دهنده گروه ویکی دیگر زیر گروه که کدهای آن ذخیره میشود اما کد که برای کاربر جالب نیست مثلا ما باید به کاربر گروه (کارفرما) زیر گروه (علی کریمی)و برای بقیه هم همین طور

محمد سلیم آبادی
شنبه 20 فروردین 1390, 12:27 عصر
من متوجه نیازتون نشدم. اگر بتونید چند نمونه از داده هاتون همراه با نتیجه ی مورد نظر و توضیح در مورد اینکه چطور توسط داده های خام می خواهید نتیجه مطلوب بدست بیاد را پست کنید بهتر میشه راهنمایی کرد و جواب دقیق داد. چرا که باید روی یک نمونه مشخص و خاص مساله تحلیل بشه با مجرد توضیحات کار پیش نمیره.
داده ها و نتیجه بایستی در جدول به صورت سطر و ستون به نمایش در بیان.

karimi.ali2005
شنبه 20 فروردین 1390, 19:56 عصر
من یک نمونه با فیلد های کمتر که مثل برنامه خودم هست درست کردم
من چند تا گروه دارم(جدول groups) برای هر گروه یک جدول داریم برای گروه صندوق جدول t1 برای گروه حساب جدول t2 و....
حال جدول t3 یک فیلد id که identity و یک فیلد groups که از جدول groups پر میشود و فیلد zir_group که با توجه به گروهی که انتخاب شده id ان گروه را ذخیره میکند
حال ما میخواهیم یک query بنوبسیم که با توجه به این جداول ،جدول جواب را درست کند
با تشکر

محمد سلیم آبادی
شنبه 20 فروردین 1390, 20:11 عصر
اینو امتحان کنید:
جدول Table3 برابر با جدول t3 شماست که ستون zip_groups داره

;WITH C AS
(SELECT id, name, grp = 1
FROM T1
UNION
SELECT id, name, grp = 2
FROM T2
UNION
SELECT id, name, grp = 3
FROM T3
)
SELECT T3.id, G.name, C.name
FROM Table3 AS T3
JOIN Groups AS G
ON T3.groups = G.id
JOIN C
ON T3.groups = C.grp
AND T3.zip_group = C.id;

karimi.ali2005
یک شنبه 21 فروردین 1390, 11:24 صبح
با تشکر
چون یک حسابداری دوبل درست کردم دو تا گروه وزیر گروه داریم یکی طرف بدهکار ویکی دیگه طرف بستنکار و یک مبلغ میخورد یک query باید به شکل زیر درست کرد


;WITH C AS (SELECT id, names, grp = 1 FROM T1 UNION SELECT id, names, grp = 2 FROM T2 UNION SELECT id, names, grp = 3 FROM T3 ) SELECT Ta.id, G.names AS bedGroup, C.names AS besZirGroup,G2.names AS besGroup,C1.names AS besZirGroup ,Ta.cost FROM Table3 AS Ta JOIN Groups AS G ON Ta.groups = G.id JOIN Groups AS G2 ON Ta.groups1=G2.id JOIN C ON Ta.groups = C.grp AND Ta.zir_group = C.id JOIN C AS C1 ON Ta.groups1=C1.grp AND ta.zir_group1=c1.id;

من کدش را با کمک دوست عزیز msalim نوشتم
من حدود 10 تا گروه دارم میخواستم ببینم روش ساده تری هست یا باید همین کد را بنویسم در ضمن وقتی تعداد رکورد ها بالا رفت آیا روی سرعت خیلی تاثیر دارد

محمد سلیم آبادی
یک شنبه 21 فروردین 1390, 23:34 عصر
بنظرم اگر تمام گروه ها رو داخل یک جدول در نظر بگیرین بهتر باشه. ss8k چیزی به نام sparse داره که کمک می کنه null ها فضایی اشغال نکنن.

karimi.ali2005
دوشنبه 22 فروردین 1390, 14:43 عصر
میشه بگید ss8k چیه من اطلاعاتی دربارش ندارم در ضمن اگه یه فیلد رو nvarchar انتخاب کنیم و مقداری در آن ذخیره نکنیم آیا باز هم فضایی اشغال میکنه

محمد سلیم آبادی
دوشنبه 22 فروردین 1390, 15:27 عصر
متاسفم. باید می نشوتم ss2k8 یعنی SQL Server 2008.
اگر مقدار دهی هم نشه بازم فضا اشغال می کنه. پیشنهاد می کنم در مورد sparse column تحقیق کنید.

mmatin4008
چهارشنبه 02 شهریور 1401, 08:44 صبح
با سلام
من میخوام بر اساس اعدادی که در یک فیلد قرار می گیرند یک فیلد دیگر را با جداول متفاوت join کنم(مثلا اگر فیلد 1 بود با جدول x وصل(join)بشه و اگر 2 بود با y و...
آیا با دستور case میشه این کار را انجام داد و دستوری غیر از case برای این کار وجود دارد
با تشکر

سلام. اگر از دستور select دارید استفاده میکنید و منظورتون این هست که در دستور select این کار رو انجام بدید فکر نمیکنم و شما باید بجای inner join از left join استفاده کنید. و هر دو جدول رو left join بدید. اینطوری هرجا فیلد 1 بود به جدول x جوین میشه و هرجا 2 بود به جدول y وصل میشه.

اما اگر برای یک مقدار یا یک رکورد میخواید join بزنید میتونید از if استفاده کنید. به این صورت که مقدار رو اول بخونید و توی یک متغیر ذخیره کنید و بعد مقایسه کنید و اگر 1 بود به جدول x جوین میشه و هرجا 2 بود به جدول y وصل بشه.