الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال: كيف يمكن عمل علاقة بين ثلاثة جداول أرجو الحل يا شباب :)

بدأه hamada33n@yahoo.com في 19 أكتوبر 2013 · 5 رد · 1,185 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمه الله و بركاته،،،،

كل عام و انتم بخير أخوتي الاعزاء،،،

 

لدي مشكلة لم أستطع حلها خصوصا أنني مبتدأ في قواعد بيانات الاسكيوال سرفر أرجوا منكم مساعدتي على حلها

المشكلة كالآتي:

 

لدي قاعدة بيانات المطلوب ان اسجل فيها بيانات المستأجرين:

المستأجرين ممكن يكونو:

1- أفراد

2- شركات

 

طبعا عملت جدول لكل واحد لأن البيانات الى هنجمعها لكل كيان بتختلف عن التاني باختصار كالآتي:

 

Persons

ID

Fname

Lname

Main_ID>>>>FK

 

CompaniesOrEstablishments

Id

Commercial_Name

Owner_Name

Main_ID>>>>FK

 

طبعا للتسهيل عاوز أجمع الجدولين السابقة في جدول واحد و ذلك باضافة جدول ثالث يكون كالأتي:

يمكن استغلال الجدول دة لجمع البيانات المشتركة بين الكيانين زي العنوان و رقم التليفون الاساسي.

 

Tenants

Main_ID

add_date

address

mobile

 

العلاقة المفروض تكون أن كل شركة أو فرد يلزم أن يتبع ريكورد واحد فقط في جدول المستأجرين (Tenants) و أن كل ريكورد في جدول المستأرجين يكون مسجل في واحد من الجدولين فقط (الافراد أو الشركات)،،،

 

المطلوب ازاي انفذ العلاقة دي على برنامج الاسكيوال سرفر؟؟؟؟

:)

#2

السلام عليكم 

 

الفكرة هي كيف تنفذ العلاقة بغض النظر عن البرنامج المستخدم 

 

اخي الفاضل  
ماذا لو تقوم بعمل جدول يكون فيه بيانات المستأجرين سواء كان فردي او شركة ويمكنك كتابه جميع التفاصيل فيه 

وجدول اخر يكون فقط للحركات بحيث يأخذ رقم الحركة تلقائي ووقت الحركة والتاريخ واي معلومة اخري

ثم تقوم بعمل View  تربط فيه بين الجدولين وبالتالي سيكون عندك جدول ثالث فيه رقم الحركة وبياناتها ورقم المستأجر وبياناته كلها في سجل واحد

 

اذا هذا ما تريده في الرد التالي سنري كيف يتم ذلك علي السكوال 

هذا علي ما فهمت منك وسامحني اذا ما قدرت افيدك 

 

تم تعديل هذه المشاركة بواسطة عبدالعزيز المخزنجي في 20 أكتوبر 2013 في 15:22

#3

أخي الكريم عبدالعزيز المخزنجي

شكرا جزيلا على ردك 

الفكرة الى طرحتها على انا جربتها لكن المشكلة أن مو عندي بس شركات أو أفراد ممكن يكون فيه أنواع أخرى جهات حكومية أو مؤسسات فردية مثلا عشان كدة ممكن تكون فكرة جدول واحد بس راح تعقد هذا الجدول و يكون حجم الجدول كبير جدا من غير داعي يؤثر على سرعة الخادم فيما بعد و في كل الاحيان راح يكون فيه حقول فاضية مو مجتاجينها من الافضل انه يكون فيه جدول مخصص لكل من النوعين أو الانواع المتاحة

فيه واحد من الاخوة اقترح عليا أني أعمل خان اضافيه في جدول Tenants و يكون أسمها TenantType بس انا مو مقتنع بالفكرة لأني أعتقد أنها ما راح تضبط بس انا حاليا بجربها ياريت يكون عندك اقتراح أفضل.

وبعدين أستخدم جمل الربط هذي:

select * from Tenants inner join Person on Tenants.TE_ID = Person.TE_ID where TenantsType = 'Person'

select * from Tenants inner join Company on Tenants.TE_ID = Company.TE_ID where TenantsType = 'Company'

 

الله يعين  :)

#4

السلام عليكم ورحمة الله وبركاته

على حسب ما فهمت أنك تريد عمل استعلام واحد يضم كل الأشخاص والشركات ثم ربطهما ببياناتهما المشتركة فى الجدول Tenants

لو كان كذلك فالموضوع سهل جداً بإذن الله

 

أولا سنقوم بعمل استعلام يضم الجدولين Persons & CompaniesOrEstablishments باستخدام Union all التى تسرد السجلات تحت بعضها بخلاف join التى تربط بين السجلات بجانب بعض فتكون النتيجة كأن لديك جدول واحد يشمل البيانات كلها وسنسمى هذا الاستعلام الناتج AllData والذى نعتبره كأنه جدول ونتعامل معه عادى جداً كأنه جدول موجود فى قاعدة البيانات

 

ثانياً: نربط بين النتيجة السابقة والمسماة AllData وبين جدول Tenants كما هو واضح فى الكود التالى

لاحظ: أننى سميت الجدول CompaniesOrEstablishments بالاسم c لسهولة الاستخدام

select * from 
(select Persons.ID, Persons.Fname, Persons.Main_ID from Persons
union all
select c.ID, c.Commercial_Name, c.Main_ID from CompaniesOrEstablishments as c) as AllDtata

inner join

Tenants on AllData.Main_ID = Tenants.MainID

ملحوظة هامة: من المعروف أن استخدام union all لضم البيانات له شروط وهو أن تختار نفس عدد الأعمدة فى كل استعلام، وأن تراعى أنواع البيانات بالترتيب كما تلاحظ أننا اخترنا ثلاثة أعمدة من كل جدول وكذلك نوع كل عمود مناسب للعمود المقابل له فى الاستعلام الآخر

 

ملحوظة 2: فى حالة رغبتك عرض كل الاسم وليس الاسم الأول فقط يمكنك إجراء عملية جمع حقول لعرض الاسم كاملاً

select * from 
(select Persons.ID, (Persons.Fname + ' ' + Persons.LName) as FullName, Persons.Main_ID from Persons
union all
select c.ID, c.Commercial_Name, c.Main_ID from CompaniesOrEstablishments as c) as AllDtata

ملحوظة3: فى حالة وجود عمود فى أحد الجداول وليس له مقابل فى الجدول الآخر يمكنك وضع مكانه null فى الجدول الناقص أو وضع قيمة ثابتة

استخدام null: 
select * from 
(select Persons.ID, (Persons.Fname + ' ' + Persons.LName) as FullName, Persons.Main_ID, null as OwnerName from Persons
union all
select c.ID, c.Commercial_Name, c.Main_ID, Owner_Name from CompaniesOrEstablishments as c) as AllDtata

استخدام قيمة ثابتة:
select * from 
(select Persons.ID, (Persons.Fname + ' ' + Persons.LName) as FullName, Persons.Main_ID, 'not company' as OwnerName from Persons
union all
select c.ID, c.Commercial_Name, c.Main_ID, Owner_Name from CompaniesOrEstablishments as c) as AllDtata

تم تعديل هذه المشاركة بواسطة ema2000_t في 21 أكتوبر 2013 في 10:01

10

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

#5

شكرا ليك يا استاذ/

ema2000_t

رد حضرتك وصلني لجزء كبير من الحل للمشكلة بارك الله فيك

#6

انا لم افهم شيء بصراحة

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…