تغییرات دستورات MINUS و INTERSECT در اوراکل 21C

در اوراکل 21c تغییرات مهمی در خصوص عملگرهای مجموعه ای set operatorsاتفاق افتاده که در این مستند آنها را بررسی خواهیم کرد.در نسخه های قبلی، عملگر UNION به تنهایی قابل استفاده بود که در این صورت بعد از اجتماع کردن رکورد های موجود در گروه ها، رکورد های تکراری را نیز حذف می کرد ( برای شناسایی رکوردهای تکراری حتما عملیات مرتب سازی باید اتفاق بیفتد ) و از طرفی با کلمه کلیدی ALLنیز قابل استفاده می باشد که در این حالت رکوردهای تکراری حذف نمی شوند ( عدم استفاده از عملیات مرتب سازی و به همین دلیل سرعت بالاتر در انجام عملیات )، اوراکل در نسخه 21c امکان استفاده از کلمه کلیدی ALL را با دیگر عملگرهای مجموعه ای را نیز فراهم کرده که در ادامه آنها را با ارائه مثال هایی بررسی خواهیم کرد.آماده سازی محیط آزمایشبرای اجرای مثال های این مستند احتیاج به جداولی داریم که با دستورات زیر ایجاد می شوند.و همچنین چند نمونه سطر در جداول وارد می کنیمdrop table t1 purge;drop table t2 purge;drop table t3 purge;create table t1 (id number(2) constraint t1_pk primary key,record_type number(2),description varchar2(12));insert into t1 values (1, 10,'TEN');insert into t1 values (2, 10,'TEN');insert into t1 values (3, 20,'TWENTY');insert into t1 values (4, 20,'TWENTY');insert into t1 values (5, 30,'THIRTY');insert into t1 values (6, 30,'THIRTY');commit;create table t2 (id number(2) constraint t2_pk primary key,record_type number(2),description varchar2(12));insert into t2 values (1, 20,'TWENTY');insert into t2 values (2, 30,'THIRTY');commit;create table t3 (id number(2) constraint t3_pk primary key,record_type number(2),description varchar2(12));insert into t3 values (1, 20,'TWENTY');insert into t3 values (2, 20,'TWENTY');insert into t3 values (3, 30,'THIRTY');insert into t3 values (4, 30,'THIRTY');commit;داده های در این جداول به شرح زیر می باشندselect record_type, description from t1;RECORD_TYPE DESCRIPTION----------- ------------10 TEN10 TEN20 TWENTY20 TWENTY30 THIRTY30 THIRTYSQL>select record_type, description from t2;RECORD_TYPE DESCRIPTION----------- ------------20 TWENTY30 THIRTYSQL>select record_type, description from t3;RECORD_TYPE DESCRIPTION----------- ------------20 TWENTY20 TWENTY30 THIRTY30 THIRTYSQL>بررسی MINUS ALLدستور MINUS سطر هایی که در مجموعه اول وجود دارند و در مجموعه دوم وجود ندارند را برای ما مشخص خواهد کرد.select record_type, descriptionfrom t1minusselect record_type, descriptionfrom t2order by 1;RECORD_TYPE DESCRIPTION----------- ------------10 TENSQL>همانطور که در خروجی دستور بالا مشاهده می کنید record typeعدد 10 را برای ما نمایش می دهد. باید دقت کنید که در جدول t1ما دو سطر از نوع record type عدد 10 داشتیم که در دستور فوق عملیات حذف رکوردهای تکراری انجام گردیده و در نهایت یک سطر به عنوان خروجی نمایش داده می شود.اما می توان عبارت فوق را با عملگر MINUS ALL دوباره اجرا کرد و توقع داشت که رکوردهای تکراری حذف نشوند و باید به این نکته اشاره کرد هرگاه از کلمه کلیدی ALL استفاده گردد تعداد رکورد از مجموعه اول که معادل آنها در مجموعه دوم باشد حذف خواهد شد و در صورتی که تعدادی بیشتر از سطرهای مشابه وجود داشته باشد سطر های مازاد نمایش داده خواهند شد ( به خروجی دستور زیر دقت شود)select record_type, descriptionfrom t1minus allselect record_type, descriptionfrom t2order by 1;RECORD_TYPE DESCRIPTION----------- ------------10 TEN10 TEN20 TWENTY30 THIRTYSQL>در دستور فوق سطرهای 20 و30 هم در خروجی نمایش داده شده اند.select record_type, descriptionfrom t1minus allselect record_type, descriptionfrom t3order by 1;RECORD_TYPE DESCRIPTION----------- ------------10 TEN10 TENSQL>در جداول t1 و t3 با توجه به این که تعداد سطرهای 20و 30 برابر بودند، فقط سطرهای 10 به عنوان خروجی نمایش داده شدند.بررسی INTERSECT ALLدستور INTERSECTسطر های مشترک در مجموعه ها را به نمایش می دهد. در حالت عادی این عملکر نیز سطرهای تکراری را حذف می کند.select record_type, descriptionfrom t1intersectselect record_type, descriptionfrom t2order by 1;RECORD_TYPE DESCRIPTION----------- ------------20 TWENTY30 THIRTYSQL>در صورتی که از دستور INTERSECT ALL استفاده گردد رکوردهای تکراری حذف نخواهند شد و تعداد سطرهای خروجی به ازای سطر های مشترک خواهد بود ( به خروجی دستورات زیر توجه کنید )select record_type, descriptionfrom t1intersect allselect record_type, descriptionfrom t2order by 1;RECORD_TYPE DESCRIPTION----------- ------------20 TWENTY30 THIRTYSQL>select record_type, descriptionfrom t1intersect allselect record_type, descriptionfrom t3order by 1;RECORD_TYPE DESCRIPTION----------- ------------20 TWENTY20 TWENTY30 THIRTY30 THIRTYSQL>دستورات EXCEPT و ALL EXCEPTدستورات فوق معادل MINUS و MINUS ALL می باشند که در دیگر پایگاه داده ها قابل استفاده بودند که اوراکل در نسخه 21C امکان استفاده از این دو دستور را نیز فراهم کرده.مطالعه مطالب بیشتر در خصوص اوراکل در سایت Artarad.ir