![]() |
استعلامات التوحيد 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
===========
تم
==========