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

احتاج جملة sql

مغلق
بدأه nore2000 في 15 يناير 2003 · 8 رد · 1,096 مشاهدة · في قواعد بيانات Oracle
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا

احتاج لجملة sql

عندي بيانات موظف لكثرتها جزأتها الى اكثر من جدول و يتم الربط بين الجداول برقم الموظف

مثلا البيانات الاساسية في جدول

و بيانات خاصة بالسكن بجدول

و بيانات خاصة بدرجات الموظفين

و جدول للحالة الاجتماعية

و هكذا

و كما ذكرت ان الربط بينهم عن طريق رقم الموظف

سأخذ مثال .. جدول السكن فيه رقم المدينة الذي يتم تحديدها من جدول خاص بالمدن

و كذلك جدول الدرجات فيه رقم الدرجة و اللذي يتم تحديدها من جدول خاص بالدرجات

في التقارير اريد جملة sql لاحضار كل بيانات موظف معين

انا حاولت فكان يعطيني بيانات كتيير مش اللي بدي اياها او مش صحيحة مش فاهمة ليش

فكيف ممكن اربط بينهم بجملة واحدة مع ملاحظة اني اريد بيانات موظف محدد يتم تحديده .. و ليس جميع الموظفين

و شكرا

#2

يمكنك استعمال جملة select بحيث تعطي ال table منطقة محددة alias

واستدعاء الحقل المطلوب من كل جدول بحيث يتم الربط بين الجداول

حسب الprimary key المحددة

وهذا مثال على جملة الselect التي تحدد داخل ال query في ال report

بحيث يكون مثلاً لدينا ثلاث جداول ( الموظفين employees، المدن cities،

الدرجات grades) فنكتب ال code بالشكل التالي

select a.emp_no,a.emp_name,b.city,c.grade
from employees  a , cities  b , grades   c
where
      a.emp_no=:v_emp_no
and
     a.emp_no=b.emp_no
and 
    a.emp_no = c.emp_no

وعند ادخال رقم الموظف المطلوب v_emp_no يتم الربط بين الثلاث جداول

واحضال ال data منها بالشكل المطلوب

طبعا في جملة ال select تقومي باستدعاء جميع البيانات التي تحتاجينها في التقرير وتقومي بالربط بينها حسب ال relation المحددة

أرجو أن أكون قد فهمت ما قصدتي في سؤالك بشكل صحيح

#3

عزيزتي Nore2000

في حالتك يوجد أكثر من جدول, في هذه الحالة يجب أن نتذكر ما يلي عند كتابة SQL statment:

من أجل ربط جدولين ينبغي وجود رابط بين الاثنين مثال:

Where emp.deptno=dept.deptn

من أجل ربط ثلاثة جداول نحتاج إلى شرطي ربط, مثلا في السطر الاول نربط بين الجدولين 1و2,

في السطر الثاني نربط بين الجدولين 2و3 أو 3و1 وهكذا متال في حالتك:

Where a.empno=b.empno

and a.empno=c.empno

وهكذا دوما نحتاج إلى شروط ربط عددها=عدد الجداول-1

#4

شكرا

لكن ما فهمتو قصدي

ساشرح اكتر

انا عندي جدول لبيانات الموظف الاساسية employee

و فيه على سبيل المثال

emp_no number

name varchar

city_no number

id number

الى اخره من البيانات

و البيانات المذكورة هي

الرقم الاساسي و الاسم مكان العمل و رقم الهوية

و هناك جدول اخر و فيهيتم تخزين عناوين الموظفين address

emp_no number

city_no number

street varchar

home_no number الى اخره

و هي رقم الموظف و محل السكن و الشارع و رقم المنزل مع ملاحظة ان

city_no في الجدول الاول تختلف عن city_no في الجول الثاني

و كلاهما يتم تحديده من جدول المدن cities و الذي فيه

city_no number

city_name varchar

و كذلك يوجد جدول الدرجات الخاصة بالموظفين degree1 و فيه

emp_no number

degree_no number

date_d date و بيانات اخرى

و هذه رقم الموظف و رقم الدرجة و تاريخ الحصول عليها .....

رقم الدرجة يوخذ من جدول الدرجات type_of_degree و فيه

degree_no number

degree_n varchar

و هناك جدول اخر خاص باضافي الموظفين فيه ايضا

emp_no , date1 , from_time , to_time و بيانات اخرى

و لكن لكل موظف اكثر من سجل في هذا الجدول

المطلوب : اريد بجملة sql الحصول على اسم الموظف و مكان عمله و محل سكنه و درجته و كذلك البيانات الموجودة عنه في اخر جدول

و ذلك حسب موظف معين و تاريخ معين (هذا التاريخ من اخر جدول)

ارجو انها الفكرة وضحت

#5

بفرض ان الجدول الأخير الذي لم تسميه وضعنا له إسم Over_time

select  a.emp_no, a.name,  a.id_no, c.city_name,b.street,d.degree_no,

          e.degree_n,f.date1, f.from_time,f.to_time

          from employee a,address b, cities c,degree1 d,type_of_degree e,

                  over_time f

          where b.emp_no = a.emp_no and

                    b.city_no = c.city_no and

                    d.emp_no = a.emp_no and

                    e.degree_no = d.degree_no and

                    f.emp_no = a.emp_no and

                    a.emp_no = &EMPLOYEE_NO and

                    f.date1 = to_date('&ENTER_DATE','dd/mm/yyyy');

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

select  a.emp_no, a.name,  a.id_no, c.city_name,b.street,d.degree_no,

          e.degree_n,f.date1, f.from_time,f.to_time

          from employee a,address b, cities c,degree1 d,type_of_degree e,

                  over_time f

          where b.emp_no = a.emp_no and

                    a.city_no = c.city_no and

                    d.emp_no = a.emp_no and

                    e.degree_no = d.degree_no and

                    f.emp_no = a.emp_no and

                    a.emp_no = &EMPLOYEE_NO and

                    f.date1 = to_date('&ENTER_DATE','dd/mm/yyyy');

وإن كنت لم أفهم لم لديك مدينتين مختلفتين لنفس الموظف

#6

شكرا كتيييييييير

و يوجد مدينتين للموظف لانه احيانا الموظف يكون محل سكنه الاصلي يختلف عن مكان عمله .. مثلا يكون يعمل في فرع بعيد عن مسكنه

عموما شكرا لانو انا هيك بدي بس في مشكلة صغيرة

انا عاوزة اي بيانات موجودة للموظف تظهر يعني في هذه الحالة اذا لم يوجد بيانات للموظف في جدول ال over_time لا تظهر بياناته الاخرى مثل الدرجة او الاسم .....

يعني انا عاوزة اذا ادخل اسم الموظف و التاريخ

تظهر البيانات و لا يظهر الاضافي له وبهذا يعرف انه لم يتم ادخال اضافي لهذا الموظف

هل يمكن ذلك ؟؟؟؟

#7

اريد ان اضيف اقتراح اتمنى ان يلبي احتياجك بشكل أشمل

ابني

view on the tables you want

and choose the fields you excatly want

and don't forgot the relation keys between the tables

بالتالي تعاملي مع one view

مثلا هذه ال view فيها حقل عدد ساعات العمل الاضافي من جدول over_time

كل ما عليك تعمليه هو :

select * from view_name

where over_hourses is not null

بذلك تستطيعي وضع الشروط التي تريدينها على ال view

اتمنى ان تتبعي هذه الطريقة لانها الاسلم لك

#8

يمكنك تفادي موضوع الزمن الإضافي وذلك بوضع علامة (+) على الحقل، هذه العلامة تفيد الآتي،

إذا كان هنالك بيانات تطابق الاختيار، فيجب إخراجها من هذا الجدول، اما إذا لم يحتوي هذا الجدول علي البيانات المطلوبة، فيجب ان لا تسقط بيانات الجداول الأخري

select  a.emp_no, a.name,  a.id_no, c.city_name,b.street,d.degree_no,

          e.degree_n,f.date1, f.from_time,f.to_time

          from employee a,address b, cities c,degree1 d,type_of_degree e,

                  over_time f

          where b.emp_no = a.emp_no and

                    a.city_no = c.city_no and

                    d.emp_no = a.emp_no and

                    e.degree_no = d.degree_no and

                    f.emp_no = a.emp_no + and

                    a.emp_no = &EMPLOYEE_NO and

                    f.date1 = to_date('&ENTER_DATE','dd/mm/yyyy');
#9

شكرا كتيير لتجاوبكم معي يا جماعة

و الله يوفق الجميع

هذا الموضوع مغلق.

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