PDA

View Full Version : یک سوال در مورد join دو تا جدول



dana_p
یک شنبه 17 مرداد 1389, 20:11 عصر
سلام به همگی.

من یه مشکلی با join دو تا جدول دارم لطفا اگه میتونید حلش کنید.

جدول اول : شامل اطلاعات سخت افزاری


_h_id _ h_name________ _ h_model _____ h_pc_code_
________ CPU ___________ _ AMD _ _____ _ 124 _ __
________ Motherboard ____ __ Gigabyte_____ _ 124 __ _
________ RAM__________ _ _ King Stone___ __ 124 _____
________ Hard Disk______ _ _ Maxtor______ __ 124 _ _ _


جدول دوم : شامل اطلاعات نرم افزاری



_s_id _ s_name_____ _ s_pc_code_
_______ office _______ _ 124 _ _
_______ photoshop____ __ 124 _ _



دستور join:

SELECT h_name,h_model,s_name
FROM
hardware JOIN software
ON
hardware.h_pc_code = software.s_pc_code
... =where s_pc_code


خروجی:
(با فیلد pc_code ، با هم join شدن)



_______________________________________________
______h_name__________ h_model________ _ s_namel
__________ CPU ____________ _ AMD _______________office
___________Motherboard __ __ Gigabyte_____________office
___________ RAM__________ ___ King Stone __________office
___________Hard Disk______ ___ Maxtor______________office
_______ CPU ___________ _ AMD________________photoshop
_______ Motherboard ____ Gigabyte_____________photoshop
________RAM____________ King Stone___________photoshop
________Hard Disk________ Maxtor______________photoshop




اما اینجا طبیعیه که ستون s_name داره تکرار میشه، که من اینو نمیخام، یعنی میخوام یه چیزی بشه مثل شکل زیر:



________ h_name__________ h_model________ _ s_namel
___________ CPU _____________ _ AMD _______________office
________Motherboard __ ___ Gigabyte_____________photoshop
___________________________ RAM__________ ____ King Stone
______________________________Hard Disk______ ____ Maxtor


یعنی یه جورایی ستون s_name تکرار نشه و بقیه اش NULL باشه.




من خودم فکر میکنم مشکل از طراحی جدول هام باشه، اما فعلا چیزی به ذهنم نمیرسه، اگه پیشنهادی دارین بفرمائید، اگه توضیحم کامل نیست بفرمائید تا بیشتر توضیح بدم.
ممنون.

محمد سلیم آبادی
دوشنبه 18 مرداد 1389, 10:46 صبح
سلام،
شما می توانید نتیجه ی دلخواهتان را هنگامی که pc_code های مختلف در دو جدول درج شده اند به نمایش بگذارین؟
مثلا در جدول اول 5 سطر با کد 124، 3 سطر با کد 125 و در جدول بعدی 2 سطر با کد 124 و 6 سطر با کد 125، و همچنین کدهایی را در دو جدول درج کنید که در جدول دیگری موجود نباشد.

من فکر می کنم بدونم نتیجه ی دلخواه شما با این داده ها چه خواهد بود ولی این نتیجه منطقی نیست. و احتمالا برای اینکه بخواهم کوئری بنویسم لطفا بگویید در چه نسخه ای می خواهین کوئری بگیرین؟

dana_p
دوشنبه 18 مرداد 1389, 13:31 عصر
سلام، مرسي msalim (http://www.barnamenevis.org/forum/member.php?u=108959)

ببخشيد ولي اين روشي كه ميگي يه جورايي غير منطقي به نظر نمياد؟
بحث فقط كوئري گرفتن نيست، بانك هم بايد درست طراحي شده باشه.
من با sql server 2005 كار مي كنم.
ميخوام نتيجشو با crystal report نشون بدم.
حالا گذشته از فيلد هاي جدول و join بالا، اگه خودتون بخواهيد دو تا جدول طراحي كنيد
و نتيجه دلخواه بالا رو بگيريد، چه كار ميكنيد؟

ممنون كه وقت گذاشتيد.

dana_p
دوشنبه 18 مرداد 1389, 13:32 عصر
سلام
يكي ميگفت با cursor مشكلت حل ميشه.
نظري ندارين؟

مرسي.

محمد سلیم آبادی
دوشنبه 18 مرداد 1389, 13:37 عصر
طراحی جداول یکسری قواعد کلی دارد که باید حتما به آنها توجه کرد.
مثلا کلید اصلی، کلید خارجی، قیود.
چیز مهمی که در ارتباط بین جداول وجود دارد ارتباط بین آنهاست. که به یک به یک، یک به چند و چند به چند تقسیم میشن. توصیه می کنم این مقاله (http://www.30sharp.com/ShowArticle.aspx?nid=13&did=245&AuthorID=11) را ابتدا بخوانید سپس شروع به کار با جداول بکنید.

dana_p
دوشنبه 18 مرداد 1389, 13:43 عصر
من همه اين چيزايي رو كه ميگي رو ميدونم. اما همونطور كه تو پست اول گفتم واسه اين مورد چيزي به ذهنم نرسيده.
با طراحي جدول ها و قواعدشون مشكل ندارم، join هاي زيادي هم تو بانكم دارم، اما رو اين يكي مشكل دارم.
ميشه يه وقتي بزاري بگي چه كار كنم؟
وقتش نيست بيشتر از اين معطل بمونم.
ممنون.

محمد سلیم آبادی
دوشنبه 18 مرداد 1389, 13:48 عصر
اگر می خواهین جواب بگیرین لطفا به پاسخ هایی که مطرح کردم پاسخ بدین مثل این:

شما می توانید نتیجه ی دلخواهتان را هنگامی که pc_code های مختلف در دو جدول درج شده اند به نمایش بگذارین؟
مثلا در جدول اول 5 سطر با کد 124، 3 سطر با کد 125 و در جدول بعدی 2 سطر با کد 124 و 6 سطر با کد 125، و همچنین کدهایی را در دو جدول درج کنید که در جدول دیگری موجود نباشد.


بهتره سطرهای متنوع تری در دو جدول بطور مثال درج کنید و نتیجه را نمایش بدین تا دقیق تر به نتیجه مطلوب پی برد.

dana_p
دوشنبه 18 مرداد 1389, 13:55 عصر
اگر می خواهین جواب بگیرین لطفا به پاسخ هایی که مطرح کردم پاسخ بدین مثل این:


بهتره سطرهای متنوع تری در دو جدول بطور مثال درج کنید و نتیجه را نمایش بدین تا دقیق تر به نتیجه مطلوب پی برد.


من جواب سوالات رو تو پست شماره 3 دادم. واقعا منظورت اينه كه بيام يه سري داده الكي بريزم تو جدول؟ (اگه نه پس منظورت از "سطر هاي متنوع تر" چيه؟):اشتباه:

dana_p
دوشنبه 18 مرداد 1389, 13:57 عصر
خب معلومه كه هر دو جدول مقادير مختلفي واسه pc_code دارن، هر كدوم تعداد زيادي pc_code دارن كه تو پست اول فقط 124 رو نوشتم.

dana_p
دوشنبه 18 مرداد 1389, 14:02 عصر
در جوابي كه تو پست 2 دادي ، فرضت بر اين بوده كه هر دو جدول تعداد سطر هاشون يكي باشه، كه خب طبيعيه كه نيست. مثلا شما فرض كردين هر دو دقيقا 8 سطر دارن، خب تو جدولهاي واقعي من مثلا يكي 50 سطر داره يكي 150 تا.
فكر كنم حالا بهتر حرف همو ميفهميم (البته اگه بيخيال اين پست نشي):لبخند:
ممنون.

محمد سلیم آبادی
دوشنبه 18 مرداد 1389, 14:09 عصر
ابتدا مجبور شدم داده های شما را تعریف کنم تا بتونم کوئری که می نویسم را امتحانش کنم.
نام جداولتان را با نام های متغیر های جدولی تعویض کنید و کوئری را امتحان کنید. بخش رنگی مد نظرم هست


declare @t1 table
(h_id int identity not null primary key,
h_name varchar(50) not null,
h_model varchar(50) not null,
h_pc_code int not null);
insert into @t1
select 'CPU','AMD',124 union all
select 'Motherboard','Gigabyte',124 union all
select 'RAM','King Stone',124 union all
select 'Hard Disk','Maxtor',124;
declare @t2 table
(s_id int identity not null primary key,
s_name varchar(50) not null,
s_pc_code int not null);
insert into @t2
select 'office',124 union all
select 'photoshop',124;
select *
from
(
select *, rd=row_number() over(partition by h_pc_code order by h_id asc)
from @t1
)d1
full join
(select *, rd=row_number() over(partition by s_pc_code order by s_id asc)
from @t2
)d2
on d1.h_pc_code=d2.s_pc_code
and d1.rd=d2.rd

dana_p
دوشنبه 18 مرداد 1389, 14:33 عصر
msalim خيلي ممنون، شما دقيقا همون چيزي را كه من نياز داشتم نوشتيد. مشكل من هم برطرف شد. بازم ممنون.

DlphIran
دوشنبه 16 اسفند 1389, 20:16 عصر
سلام
من هم همین مشکل (سوال اول تاپیک) رو دارم اما کمی سخت تر، در ضمن از delphi6 و Sql server2000 استفاده می کنم.
رکوردهای من به این صورت هست:
رکورد Panel فیلدها: Cod ، Cods ، P ---- رکورد monit فیلدها: Cod ، Cods ، m ----- رکوردsound فیلدها: Cod ، Cods ، s ----- رکورد elctric فیلدها: Cod ، Cods ، e ---- رکورد lok فیلدها: Cod ، Cods ، l

رکورد Sell فیلدها: Cod ، Dy ، Dm ، Dd

برای اتصال این جدولها براساس فیلد کلید cod هر روشی که به عقلم رسید انجام دادم اما باز هم فیلدهای تکراری نمایش داده می شه .
لطفا راهنماییم کنید با تشکر

DlphIran
سه شنبه 17 اسفند 1389, 13:02 عصر
اینم نمونه دستوراتی که برای اتصال استفاده کردم:


with form7.adoquery1 do
begin
sql.Clear;
sql.Add('select top 40 * from sell');
sql.Add('left outer join panel');
sql.Add('on sell.cod=panel.cod');
sql.Add('left outer join monit');
sql.Add('on sell.cod=monit.cod');
sql.Add('left outer join sound');
sql.Add('on sell.cod=sound.cod');
sql.Add('left outer join elctric');
sql.Add('on sell.cod=elctric.cod');
sql.Add('left outer join lok');
sql.Add('on sell.cod=lok.cod');
sql.add('order by sell.cod desc');
active:=true;
end;

DlphIran
چهارشنبه 18 اسفند 1389, 13:44 عصر
هنوزم منتظر راهنمایی دوستان هستم