PDA

View Full Version : یه دستور اس کیو از در دو جدول که به ازای یک فیلد از همه فیلد های جدول اول هم نمایش داده شود



hojjatshariffam
یک شنبه 24 شهریور 1392, 12:50 عصر
یه جدول اصلی دارم که لیست یه سری اقلام رو توش داره (تعداد محدودی ردیف که در یک صفحه ویندوزی قابل نمایش باشه یا اینکه بصورت پیج به پیج نمایش داده بشه)
یه جدول دیگه دارم که فرضا از این اقلام جدول اول سفارش داده میشه که به ازای هر مشتری ثبت میشه

مشتری اول فرضا سه تا از این اقلام رو سفارش میده (کاری هم به تعداد ندارم سفارش از هر قلم ندارم)
مشتری دوم پنج تا از این اقلام
مشتری دوم .....

حالا من می خوام یک ویو درست کنم که همه اقلام جدول اول توش باشند و من فیلتر رو بزارم روی کد مشتری و وقتی کد مشتری رو میدم همه اقلام نمایش داده بشن و اونایی که ازشون سفارش داده شده رو یه فیلد خاصی رو پر و در صورت عدم سفارش null باقی بمونه(فرضا تیک خورده باشه یا تعداد سفارش نشون داده بشه)

با left outer join درست نشون داده نمی شه
من می خوام به تعداد ردیف های جدول اول برام ردیف بیاد در هر بار که یک مشتری رو به Where میفرستم
حالا اگر مشتری از اون سفارش داده باشه کد مشتری (یا تعداد سفارش ) پر باشه و در صورت عدم سفارش برام تو ردیف های سفارش داده نشده null باشه
طرف نرم افزار می تونم پیاده سازیش کنم ولی سرعت به شدت پایین میاد می خوام خود اس کیو ال این نتیجه رو بهم بده
طرف نرم افزار می خوام یه لیستی از اقلام داشته باشم که اگه اون شخص از اون سفارش داده تیک بخوره و اگه سفارش نداده باشه تیک نخوره

نظر دوستان در این رابطه چیه؟

hojjatshariffam
یک شنبه 24 شهریور 1392, 14:01 عصر
با این دستور میشه بدست آورد یه همچین چیزی ولی با where استفاده نمیشه حتما باید از استورد پروسیجر استفاده بشه یا اینکه خود دستورات رو پاس بدیم


SELECT TOP (100) PERCENT dbo.Per_Dossier_Table.MedicineFile_ID, dbo.DossierQuestion_Table.Question_Text, dbo.Per_Dossier_Table.Value,
dbo.Per_Dossier_Table.Comment, dbo.DossierQuestion_Table.Default_Value, dbo.DossierQuestion_Table.Default_Comment,
dbo.Per_Dossier_Table.Question_ID
FROM dbo.DossierQuestion_Table LEFT OUTER JOIN
dbo.Per_Dossier_Table ON dbo.DossierQuestion_Table.Question_ID = dbo.Per_Dossier_Table.Question_ID AND dbo.Per_Dossier_Table.MedicineFile_ID = 1

hojjatshariffam
یک شنبه 24 شهریور 1392, 19:57 عصر
اینم یه دیاگرام
110720
من میخوام از این دو جدول جوین بگیرم
بعد روی medicineFile_ID فیلتر بزارم و در عین حال همه فیلد های جدول dossierQuestion_Table در نتیجه گزارش بیان تا در برنامه نشون بدم و اونایی که با جدول دوم اشتراک دارند رو تیک زده نشون بدم و اونایی که null هستند رو تیک نخورده در واقع اونهایی که value دارند رو تیک خورده نشون بدم و اون ردیف هایی که در فیلد value اونها null ارسال شده رو بدون تیک
مشکل اینجاست که در left outer join این null ها به ازای کل جداول پر میشن ولی من می خوام به ازای فیلد مورد نظر من (یعنیmedicineFile_ID ) با null پر شوند.

محمد سلیم آبادی
دوشنبه 25 شهریور 1392, 20:43 عصر
برای دریافت جواب دقیق یک نمونه داده از هر دو جدول همچنین Result Set مورد نظر بر اساس داده های نمونه را در قالب جدول در اینجا قرار بدین.

hojjatshariffam
سه شنبه 26 شهریور 1392, 14:09 عصر
برای دریافت جواب دقیق یک نمونه داده از هر دو جدول همچنین Result Set مورد نظر بر اساس داده های نمونه را در قالب جدول در اینجا قرار بدین.

فرض کنید در جدول کالا
کد=> نام کالا
1 => کالای A
2 => کالای B
3 => کالای C

رو داریم
در جدول مشتری سه مشتری با نام های
کد => نام مشتری
11 => مشتری 1
12 => مشتری 2
13 => مشتری 3 رو دارم

و در نهایت در جدول سفارش فیلد های کد مشتری و کد کالا رو داریم رو دارم

کد کالا کد مشتری
1 => 11
2 => 11
1 => 13

از داده های جدول سفارش معلومه که مشتری 1 کالای A و B رو سفارش داده و مشتری 3 فقط کالای A رو
حالا من می خوام یه ویو درست کنم از این سه جدول (حالا جدول مشتری رو زیاد لازم ندارم فقط کد مشتری لازمه که اونم در جدول سفارش هست و نیاز به نام مشتری ندارم) که در نتیجه این ویو این داده ها باشه

نام کالا کد کالا کد مشتری
کالای A => کد1 => 11
کالای B =>کد2 => 11
کالای null <= null <= C

کالای null <= null <= A
کالای null <= null <= B
کالای null <= null <= C

کالای A => کد1 => 13
کالای null <= null <= B
کالای null <= null <= C

و وقتی کد مشتری 11 رو تو Where بزارم برام سه سطر زیر رو بیاره
نام کالا کد کالا کد مشتری
کالای A => کد1 => 11
کالای B =>کد2 => 11
کالای null <= null <= C

و اگر کد مشتری 12 رو تو Where بزارم برام سه سطر زیر رو بیاره
نام کالا کد کالا کد مشتری
کالای null <= null <= A
کالای null <= null <= B
کالای null <= null <= C

و اگر کد مشتری 13 رو تو Where بزارم برام سه سطر زیر رو بیاره
نام کالا کد کالا کد مشتری
کالای A => کد1 => 13
کالای null <= null <= B
کالای null <= null <= C

در واقع می خوام به ازای هر کد مشتری همه کالا ها نشون داده بشن

محمد سلیم آبادی
سه شنبه 26 شهریور 1392, 17:34 عصر
دو جدول مشتری و کالا را با هم در یک Derived Table ضرب دکارتی میکنید (با کمک CROSS JOIN) سپس جدول سفارشات را با جدول تولید شده در مرحله قبل RIGHT OUTER JOIN می کنید با یک شرط Composite.
حالا بر اساس نتیجه هر شرطی که میخواهید بگذارید و هر ستونی که مدنظرتون هست را انتخاب کنید.


declare @Products table
(product_id int not null primary key,
product_name varchar(100) not null)

declare @Customers table
(customer_id int not null primary key,
customer_name varchar(100) not null);

declare @Orders table
(product_id int not null,
customer_id int not null,
primary key (product_id, customer_id));

insert into @Products values (1, 'A'), (2, 'B'), (3, 'C');
insert into @Customers values (1,'C1'), (2,'C2'), (3,'C3'), (4,'C4');

insert into @Orders(customer_id, product_id) values (1,1),(1,2),(1,3), (2,1),(2,2), (3,1)

select *
from @Orders O
right outer join (select * from @Customers cross join @Products) D
on o.customer_id = d.customer_id
and o.product_id = d.product_id;

hojjatshariffam
سه شنبه 26 شهریور 1392, 21:05 عصر
فقط با این فرضیات
اگر جدول customers ردیف های زیادی داشته باشه و سرعت اجرای کوئری با یک where روی کد مشتری پائین نباشه؟