استعلامات التوحيد

    Union Queries

إعداد : محمد طاهر

 

 

 

استعلامات التوحيد Union Queries

 

 

ما هو إستعلام التوحيد ؟؟

 

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

 

فمثلا لو لديك جدول به  بيانات العاملين في احدي شركات مؤسسة و نسميه جدول ج1، و جاءتك قاعدة بيانات جديدة لشركة أخري من شركات المجموعة و بها جدول لبيانات العاملين و نسميه ج2 و تريد عمل استعلام واحد يجمع بيانات الجدولين فى إستعلام واحد . فهنا نحن نتحدث عن تطبيق مباشر لاستعلام التوحيد

 

و استعلام التوحيد هو أحد أنواع استعلامات ال SQL  ، فلتصميمه تكتب جملة الاس كيو ال المناظرة ، و ليس كاستعلامات الاختيار(التحديد و الاستعلام المحوري ) أو الاستعلامات الاجرائية (الالحاق و الحذف و التحديث و انشاء جدول) و التي يمكن  استخدام الواجهة الرسومية فقط لتصميمها .

 

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

 

 

عمل استعلام توحيد

 

 

 الخطوة الأولي فى عمل استعلام التوحيد هي تحضير جملة الاس كيو ال المناظرة لكل من الاستعلامات المراد توحيدها فى استعلام واحد

و يمكن كتابتها مباشرة ،  أو عمل استعلام تحديد Select query مؤقت ( لاداعي لحفظه)  و نختار فيه الحقول   التي نريد دمجها  مع الاستعلامات الأخري . ثم من زر التصميم نختار وضع الاس كيو ال   فتظهر لنا جملة الاستعلام . فننسخها الي الاستعلام الجديد  ثم لا نحفظ الاستعلام المؤقت  و نكرر ذلك لكل الاستعلامات المراد توحيدها فى استعلام واحد

 

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

 

 

 

أول تطبيق سنقوم به ، هو دمج أسماء الموظفين من جدول Employees  مع أسماء جهة الاتصال من جدول Suppliers مع اسماء جهة  الاتصال  من جدول Customers و ذلك فى استعلام واحد يعرضها جميعا .

 

فنفتح استعلام جديد فى وضع التصميم

ثم لا نختار أي جدول

ثم من قائمة Queries

نختار

SQL Specific

Union

فتتحول الشاشة الي وضع كتابة تعبير الاس كيو ال

 

و نفتح فى نفس الوقت استعلام جديد ( المؤقت الذي تحدثنا عنه ) ونبدأ من خلاله فى تكوين جمل الاس كيو ال الخاصة بالاستعلامات المراد دمجها ، و نبدأ فيه  باختيار الاسم من جدول الموظفين و نحول الي وضع الاس كيو ال فنجد الجملة به كالتالي

 

SELECT Employees.FirstName
FROM Employees;
 

فننسخها الي استعلام التوحيد بدون الفاصلة الخاتمة

ثم نضيف بعدها كلمة Union  استعدادا لاستقبال الجزء التالي من الاستعلام

 

و نعود الاستعلام المؤقت ، و نغير الجدول الي Customers و نختار منه حقل ContactName  ونكرر نقل الجملة بدون الفاصلة المنقوطة الي استعلام التوحيد ثم نضيف بعدها كلمة Union  استعدادا لاستقبال الجزء التالي من الاستعلام

 

و نعود للمرة الأخيرة الي الاستعلام المؤقت و نختار حقل ContactName  من جدول Suppliers

و هذه المرة لا نتبعه ب Union حيث انه الاخير و لكن نتبعه بفاصلة منقوطة لختم جملة الاس كيو ال

 

فيصبح تكون استعلام التوحيد كالتالي

 

SELECT Employees.FirstName
FROM Employees

Union

SELECT Customers.ContactName
FROM Customers

Union

SELECT Suppliers.ContactName
FROM Suppliers;
 

 

ثم نختار تنفيذ الاستعلام من علامة التعجب الحمراء   أو  نختار عرض  البيانات فى وضع العرض datasheet view   فيعرض لنا استعلام جديد تم فيه توحيد جميع الاسماء من الجداول الثلاثة فى استعلام واحد ، عدد السجلات الظهرة به =129 أي مجموع عدد سجلات الجداول الثلاثة .

 

و للعودة الي وضع التصميم ثانية نضغط علي    ثم نحفظ الاستعلام باسم Q1

 

 و هكذا نكون أنشأنا أول  استعلام توحيد

 

ملاحظة : اسم الحقل فى الاستعلام الناتج هو اسم الحقل الموجود فى أول جزء من لااستعلام FirstName و يمكننا تغييره كما سنري لاحقا.

 

 

عمل ترتيب لسجلات  استعلام توحيد

 

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

 


ORDER BY FirstName DESC;

 

قبل الفاصلة المنقوطة 

و بذلك يتم  ترتيب الاستعلام السابق تنازليا ، فتكون جملة الاس كيو ال كما في استعلام Q2

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

 

 

 

إعادة تسمية حقول استعلام  توحيد

 

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

و الآن نريد أن نغير الاسم الناتج فى الاستعلام الي اسم آخر . و سيتم ذلك مثلما تم فى استعلامات التحديد باستخدام معامل As

فاذا أردنا تسمية الحقل الناتج باسم Mynames مثلا

 

فيكون الاستعلام كالتالي (Q3) :

 

SELECT Employees.FirstName as Mynames
FROM Employees

Union

SELECT Customers.ContactName
FROM Customers

UNION SELECT Suppliers.ContactName
FROM Suppliers
ORDER BY Mynames DESC;

 

 

و من المفترض أن الاستخدام المثالي هو اعادة تسمية جميع الحقول المناظرة كما فى استعلام رقم Q4

 

SELECT Employees.FirstName as Mynames
FROM Employees

Union

SELECT Customers.ContactName
as Mynames
FROM Customers

UNION SELECT Suppliers.ContactName as Mynames
FROM Suppliers
ORDER BY
Mynames DESC;

 

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

 

مثلا لنستبدل جدول Employees  بجدول Emp  و الذي تكررت به كل قيم الاسم الأول بعد تعديلها جميعا الي Taher  كما فى استعلام رقم Q5

فتكون جملة الاس كيو ال كالتالي

 

SELECT Emp.FirstName as Mynames
FROM Emp

Union

SELECT Customers.ContactName as Mynames
FROM Customers

UNION SELECT Suppliers.ContactName as Mynames
FROM Suppliers
ORDER BY Mynames DESC;

 

 

 

ثم نختار تنفيذ الاستعلام من علامة التعجب الحمراء   أو  نختار عرض  البيانات فى وضع العرض datasheet view   فيعرض لنا استعلام جديد تم فيه توحيد جميع الاسماء من الجداول الثلاثة فى استعلام واحد ، عدد السجلات الظهرة به =121  و ليس 129 كما سبق  أي  أقل من مجموع عدد سجلات الجداول الثلاثة . وهذا نتج من  تكرار الاسم طاهر فى جدول الموظفين تسعة مرات، فتم اعتبار مرة واحدة منها فقط فى الاستعلام

 

أي أنه بطبيعته يستبعد تلقائيا القيم المكررة

 

و فى حالة اذا اردنا اظهارها نستبدل كلمة  UNION  بكلمة  UNION ALL   كما فى استعلام رقم  Q6

فتكون الجملة :

 

 

SELECT Emp.FirstName as Mynames
FROM Emp

Union ALL

SELECT Customers.ContactName as Mynames
FROM Customers

UNION ALL SELECT Suppliers.ContactName as Mynames
FROM Suppliers
ORDER BY Mynames DESC;
 

 

فتظهر السجلات جميعا ، حتي المكرر منها

 

الشرط فى استعلام التوحيد

 

بقي لنا اضافة شرط علي الاستعلام الكلي

و ذلك يتم باستخدام where  كالمعتاد

 

و يمكن وضع الشرط كل  جزء من مكونات الاستعلام أو علي عدد من الأجزاء فقط ، و لكن ليس علي الاستعلام ككل

 

و هنا سنختار أن الاسماء المختارة من  جدول  فقط تبدأ بحرف ال A  فى الثالثة أجزاء

 فتكون جملة الاس كيو ال كما فى Q7  كالتالي :

 

SELECT Emp.FirstName as Mynames
FROM Emp WHERE ((Emp.FirstName ) Like "A*")
Union ALL
SELECT Customers.ContactName as Mynames
FROM Customers WHERE ((Customers.ContactName ) Like "A*")
UNION ALL SELECT Suppliers.ContactName as Mynames
FROM Suppliers WHERE ((Suppliers.ContactName ) Like "A*");

 

و هذا الاستعلام يظهر الاسماء التي تبدأ فقط بحرف ال A و هي 12 اسم

 

 

ملاحظة أخيرة :

 

يمكن اجراء حسابات علي الحقول المختلفة للاستعلام قبل دمجه أو ادراج حقول مستنتجة  ، فمثلا لو لديك حقل رقمي و تريد دمجه باشارة سالبة من الجدول الاول و باشارة موجبة من الجدول الثاني (مثل دمج بيانات مثلا من جدول ايرادات و جدول مصروفات ، و مطلوب ظهور المصروفات بالسالب فى الاستعلام مع ضرب القيمة فى زيادة قدرها 25% مثلا  و بالاضافة الي ذلك نريد اضافة حقل معرف يوضح هل هذا ايراد أم مصروف فى الاستعلام الناتج  ) .

 

مثال  كما فى استعلام رقم Q8

 

SELECT - tblcost.Value*1.25 as Amount, tblcost.date as [Trans-Date], "Income" AS [In-or-cost]
FROM tblcost

UNION ALL SELECT tblincome.Value as Amount, tblincome.date as [Trans-Date], "Cost" AS [In-or-cost]
FROM tblincome

order by [Trans-Date];
 

 

فتم ضرب حقل القيمة فى 1.25 و اضافة الاشارة السالبة اليه قبل دمجه

و تم اعادة تسميته الي ِAmount

 و تم اعادة تسمية التاريخ الي Trans-Date و نلاحظ أن الاسم تم كتابته بين []   و ذلك لوجود علامة ال - داخل الاسم ، و كذلك عند وجود مسافة فى الاسم لابد من اضافة ال [] .

و تم اضافة حقل مميز للسجلات فى الاستعلام ، بحيث يعبر عن السجل هل هو من جدول الايراد أم المصروف و تم تسميته ب

In-or-Cost

 

 

 

 

 

 

 

===========

تم

==========