استفاده از دستور case در join
با سلام
من میخوام بر اساس اعدادی که در یک فیلد قرار می گیرند یک فیلد دیگر را با جداول متفاوت join کنم(مثلا اگر فیلد 1 بود با جدول x وصل(join)بشه و اگر 2 بود با y و...
آیا با دستور case میشه این کار را انجام داد و دستوری غیر از case برای این کار وجود دارد
با تشکر
نقل قول: استفاده از دستور case در join
سلام،
بنظرم برای حل مسالتون نیاز به چنین کارهایی ندارین.
اگر مسالتون را با کمک داده های نمونه و نتیجه مورد نظر توضیح بدین تا با سناریوتون آشنا بشیم آون وقت میشه به حل مساله فکر کرد.
نقل قول: استفاده از دستور case در join
من یک برنامه حسابداری کوچیک درست کردم برای یک برنامه پیمانکاری ساختمان حال یه حسابداری دوبل براش نوشتم همون دفتر روزنامه حال بر اساس گروهها(کارفرما.صندوق.مصالح فروش و...) که انتخاب می کند به جدول ان گروه مثلا تمام کارفرماها میرم وکارفرما را کاربر انتخاب می کتد حال دوفیلد اطلاعات داریم یکی نشان دهنده گروه ویکی دیگر زیر گروه که کدهای آن ذخیره میشود اما کد که برای کاربر جالب نیست مثلا ما باید به کاربر گروه (کارفرما) زیر گروه (علی کریمی)و برای بقیه هم همین طور
نقل قول: استفاده از دستور case در join
من متوجه نیازتون نشدم. اگر بتونید چند نمونه از داده هاتون همراه با نتیجه ی مورد نظر و توضیح در مورد اینکه چطور توسط داده های خام می خواهید نتیجه مطلوب بدست بیاد را پست کنید بهتر میشه راهنمایی کرد و جواب دقیق داد. چرا که باید روی یک نمونه مشخص و خاص مساله تحلیل بشه با مجرد توضیحات کار پیش نمیره.
داده ها و نتیجه بایستی در جدول به صورت سطر و ستون به نمایش در بیان.
1 ضمیمه
نقل قول: استفاده از دستور case در join
من یک نمونه با فیلد های کمتر که مثل برنامه خودم هست درست کردم
من چند تا گروه دارم(جدول groups) برای هر گروه یک جدول داریم برای گروه صندوق جدول t1 برای گروه حساب جدول t2 و....
حال جدول t3 یک فیلد id که identity و یک فیلد groups که از جدول groups پر میشود و فیلد zir_group که با توجه به گروهی که انتخاب شده id ان گروه را ذخیره میکند
حال ما میخواهیم یک query بنوبسیم که با توجه به این جداول ،جدول جواب را درست کند
با تشکر
نقل قول: استفاده از دستور case در join
اینو امتحان کنید:
جدول 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;
1 ضمیمه
نقل قول: استفاده از دستور case در join
با تشکر
چون یک حسابداری دوبل درست کردم دو تا گروه وزیر گروه داریم یکی طرف بدهکار ویکی دیگه طرف بستنکار و یک مبلغ میخورد یک 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 تا گروه دارم میخواستم ببینم روش ساده تری هست یا باید همین کد را بنویسم در ضمن وقتی تعداد رکورد ها بالا رفت آیا روی سرعت خیلی تاثیر دارد
نقل قول: استفاده از دستور case در join
بنظرم اگر تمام گروه ها رو داخل یک جدول در نظر بگیرین بهتر باشه. ss8k چیزی به نام sparse داره که کمک می کنه null ها فضایی اشغال نکنن.
نقل قول: استفاده از دستور case در join
میشه بگید ss8k چیه من اطلاعاتی دربارش ندارم در ضمن اگه یه فیلد رو nvarchar انتخاب کنیم و مقداری در آن ذخیره نکنیم آیا باز هم فضایی اشغال میکنه
نقل قول: استفاده از دستور case در join
متاسفم. باید می نشوتم ss2k8 یعنی SQL Server 2008.
اگر مقدار دهی هم نشه بازم فضا اشغال می کنه. پیشنهاد می کنم در مورد sparse column تحقیق کنید.
نقل قول: استفاده از دستور case در join
نقل قول:
نوشته شده توسط
karimi.ali2005
با سلام
من میخوام بر اساس اعدادی که در یک فیلد قرار می گیرند یک فیلد دیگر را با جداول متفاوت 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 وصل بشه.