4/09/2013

Correlated Subqueries

السلام عليكم 
Correlated Subqueries

يستخدم الـ Correlated Subqueries لمعالجه الصفوف (صف صف) ويتم تنفيذ كل استعلام فرعى مره واحده لكل صف من الأستعلام الخارجى (outer query) وتتم معالجته بواسطه (parent statement) ويمكن ان يكون parent statement جمله select ,update and delete

اعتقد ان الكلام مبهم بعض الشىء ولكن ان شاء الله من خلال الأسطر القادمه سوف يتضح لك الأمر بشكل واضح واكثر تفصيل ولكن اقرا الموضوع من البدايه للنهايه اكثر من مره  فى حاله لو لم تتضح لك الرؤيا -بس ان شاء الله مع نهايه الموضوع وقرائته بتمعن هتلاقى كله تمام - واى سؤال حاضر ان شاء الله

نرجع لموضعنا الأساسى فى البدايه انت محتاج انك تعرف الفرق بين Nested subquery والـ Correlated Subqueries  ومن خلال الفروقات ده هتقدر تعرف ايه هو اصلا Correlated Subqueries وامتى تستخدمه وهتستفيد ايه لما تستخدمه لان من بره شكل Nested subquery و Correlated Subqueries شبه بعض .

ما الفرق بين  Nested subquery و Correlated Subqueries ؟
Nested Subqueries Versus Correlated Subqueries


** -يفضل القراءه اولا عن  Nested subquery قبل قراءه هذا الدرس-

اوراكل تقوم بقراءه  Nested subquery  اولا وتقوم بتنفيذها مره واحده وتقوم بأسترجاع قيمه ويتم استخدامها فى الأستعلام الرئيسى ولكن Correlated Subqueries  يتم تنفيذه مره  واحده على (صف صف) 
طيب يعنى ايه الكلام ده
 فى حاله  Nested subquery 
الـ inner query  ينفذ اولا لأيجاد قيمه
الـ outer query  ينفذ مره واحده ويستخدم القيمه التى استرجعها الـ inner 

 Correlated Subqueries
- يحصل على الصف المرشح (fetched by the outer query)
-ينفذ الـ inner query  بأستخدام القيمه المسترجعه من الصفوف المرشحه
- يستخدم نتائجج القيم من الـ inner query  للتأكد من تأهيل او عدم تأهيل المرشح منها
- ويكرر نفس العمليه حتى اخر صف مُرشح

صوره (1-1)

وكما هو موضح من صوره (1-1)  انه فى البدايه يحضر الصفوف المرشحه من (outer query)  ثم يقوم بتنفيذ الـ  (inner query)  بأستخدام القيمه المسترجعه من الصفوف المرشحه واخيرا يستخدم القيم الموجوده فى  (inner query) ليرى تأهيلها او عدم تأهيلها 

بطريقه اخرى ...

يمكنك استخدام الـ Correlated Subqueries للأجابه على سؤال متعدد الأجزاء والتى تعتمد اجابته على قيمه تتم معالجتها فى كل صف بواسطه  (parent statement)
ويمكنك استخدام كلا من ANY and ALL مع Correlated Subqueries

صوره (1-2)


وهذا هو الكود العام لـ Correlated Subqueries

SELECT column1, column2, ...
FROM   table1 outer
WHERE  column1 operator
                       (SELECT column1, column2
                        FROM   table2
                        WHERE  expr1 = outer.expr2);


مثال توضيحى
من خلال المثال التالى اريد استعراض الموظفين الذين راتبهم اكبر من متوسط رواتب الأدارات 
الـ  Correlated Subqueries  يقوم تحديدا بحساب متوسط مرتبات كل اداره 


SELECT last_name, salary
       ,department_id
FROM  employees outer
WHERE salary >
              (SELECT AVG(salary)
               FROM   employees
               WHERE  department_id = outer.department_id);

LAST_NAME                   SALARY DEPARTMENT_ID
------------------------- -------- -------------
King                         24000            90 
Hunold                        9000            60 
Lorentz                       7098            60 
Greenberg                    12008           100 
Faviet                        9000           100 
Raphaely                     11000            30

38 rows selected


فى المثال الـ (inner query) و (outer query) يستخدمو نفس الجدول وهو جدول الـ EMPLOYEES فى جمله الـ FROM وقمت بأعطاء alias لجدول الـ EMPLOYEES فى جمله  (outer query) وقمت بأعطاءه alias  مش عشان اخلى الجمله سهله القراءه ولكن بدون  alias  لن تعمل الجمله اصلا . لان  ( inner query statment)  لن تستطيع التمييز ما بين (inner table column و (outer table column).

مثال اخر
فى هذه المثال اريد استعراض بيانات الموظفين الذين قامو بتغيير وظيفتهم على الاقل مرتين

SELECT e.employee_id
      ,last_name,e.job_id
FROM   employees e
WHERE 2 <= (SELECT count(*)
            FROM   job_history
            WHERE employee_id = e.employee_id);

EMPLOYEE_ID LAST_NAME                 JOB_ID   
----------- ------------------------- ----------
        101 Kochhar                   AD_VP      
        176 Taylor                    SA_REP     
        200 Whalen                    AD_ASST 


نبدا فى موضوع تانى وهو :
Correlated UPDATE

الكود العام لـ Correlated UPDATE

UPDATE table1 alias1
SET column = (SELECT expression
              FROM   table2 alias2
              WHERE  alias1.column = alias2.column);


مثال توضيحى 
SETUP

CREATE TABLE EMMP AS 
SELECT * FROM employees
WHERE 1 = 2
table EMMP created.

DESC EMMP
EMPLOYEE_ID             NUMBER(6)    
FIRST_NAME              VARCHAR2(20) 
LAST_NAME      NOT NULL VARCHAR2(25) 
EMAIL          NOT NULL VARCHAR2(25) 
PHONE_NUMBER            VARCHAR2(20) 
HIRE_DATE      NOT NULL DATE         
JOB_ID         NOT NULL VARCHAR2(10) 
SALARY                  NUMBER(8,2)  
COMMISSION_PCT          NUMBER(2,2)  
MANAGER_ID              NUMBER(6)    
DEPARTMENT_ID           NUMBER(4)

INSERT INTO HR.EMMP VALUES (100,'Steven','King','SKING','515.123.4567',TO_DATE('17/06/03','DD/MM/RR'),'AD_PRES',24000,NULL,NULL,90);
INSERT INTO HR.EMMP VALUES (101,'Neena','Kochhar','NKOCHHAR','515.123.4568',TO_DATE('21/09/05','DD/MM/RR'),'AD_VP',17000,NULL,100,90);
INSERT INTO HR.EMMP VALUES (102,'Lex','De Haan','LDEHAAN','515.123.4569',TO_DATE('13/01/01','DD/MM/RR'),'AD_VP',17000,NULL,100,90);
INSERT INTO HR.EMMP VALUES (103,'Alexander','Hunold','AHUNOLD','590.423.4567',TO_DATE('03/01/06','DD/MM/RR'),'IT_PROG',9000,NULL,102,60);
INSERT INTO HR.EMMP VALUES (104,'Bruce','Ernst','BERNST','590.423.4568',TO_DATE('21/05/07','DD/MM/RR'),'IT_PROG',6000,NULL,103,60);
INSERT INTO HR.EMMP VALUES (105,'David','Austin','DAUSTIN','590.423.4569',TO_DATE('25/06/05','DD/MM/RR'),'IT_PROG',4800,NULL,103,60);
INSERT INTO HR.EMMP VALUES (106,'Valli','Pataballa','VPATABAL','590.423.4560',TO_DATE('05/02/06','DD/MM/RR'),'IT_PROG',4800,NULL,103,60);
INSERT INTO HR.EMMP VALUES (107,'Diana','Lorentz','DLORENTZ','590.423.5567',TO_DATE('07/02/07','DD/MM/RR'),'IT_PROG',7098,NULL,103,60);
INSERT INTO HR.EMMP VALUES (108,'Nancy','Greenberg','NGREENBE','515.124.4569',TO_DATE('17/08/02','DD/MM/RR'),'FI_MGR',12008,NULL,101,100);
COMMIT;

ALTER TABLE EMMP
ADD (DEPARTMENT_NAME VARCHAR2(50));
table EMMP altered.


من خلال هذا المثال وبأستخدام Correlated Subqueries  اريد اضافه اسماء الادارت فى جدول EMMP بناء على كود الاداره DEPARTMENT_ID


UPDATE EMMP E
SET DEPARTMENT_NAME = (SELECT DEPARTMENT_NAME
                       FROM   DEPARTMENTS D
                       WHERE  D.DEPARTMENT_ID = E.DEPARTMENT_ID);
COMMIT;

9 rows updated.
commited.

SELECT DEPARTMENT_ID 
      ,DEPARTMENT_NAME
FROM  EMMP

DEPARTMENT_ID DEPARTMENT_NAME                                  
------------- --------------------------------------------------
           90 Executive                                          
           90 Executive                                          
           90 Executive                                          
           60 IT                                                 
           60 IT                                                 
           60 IT                                                 
           60 IT                                                 
           60 IT                                                 
          100 Finance                                            

 9 rows selected 


Correlated DELETE
DELETE FROM table1 alias1
WHERE  column operator
       (SELECT expression
        FROM   table2 alias2
        WHERE  alias1.column = alias2.column);
-->

No comments:

Post a Comment