در اوراکل 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 TEN

         10 TEN

         20 TWENTY

         20 TWENTY

         30 THIRTY

         30 THIRTY

SQL>

select record_type, description from t2;

RECORD_TYPE DESCRIPTION

———– ————

         20 TWENTY

         30 THIRTY

SQL>

select record_type, description from t3;

RECORD_TYPE DESCRIPTION

———– ————

         20 TWENTY

         20 TWENTY

         30 THIRTY

         30 THIRTY

SQL>

بررسی MINUS ALL

دستور MINUS سطر هایی که در مجموعه اول وجود دارند و در مجموعه دوم وجود ندارند را برای ما مشخص خواهد کرد.

select record_type, description

from   t1

minus

select record_type, description

from   t2

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         10 TEN

SQL>

همانطور که در خروجی دستور بالا مشاهده می کنید record type عدد 10 را برای ما نمایش می دهد. باید دقت کنید که در جدول t1 ما دو سطر از نوع record type عدد 10 داشتیم که در دستور فوق عملیات حذف رکوردهای تکراری انجام گردیده و در نهایت یک سطر به عنوان خروجی نمایش داده می شود.

اما می توان عبارت فوق را با عملگر MINUS ALL دوباره اجرا کرد و توقع داشت که رکوردهای تکراری حذف نشوند و باید به این نکته اشاره کرد هرگاه از کلمه کلیدی ALL  استفاده گردد تعداد  رکورد از مجموعه اول که معادل آنها در مجموعه دوم باشد حذف خواهد شد و در صورتی که تعدادی بیشتر از سطرهای مشابه وجود داشته باشد سطر های مازاد نمایش داده خواهند شد ( به خروجی دستور زیر دقت شود)

select record_type, description

from   t1

minus all

select record_type, description

from   t2

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         10 TEN

         10 TEN

         20 TWENTY

         30 THIRTY

SQL>

در دستور فوق سطرهای 20 و30 هم در خروجی نمایش داده شده اند.

select record_type, description

from   t1

minus all

select record_type, description

from   t3

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         10 TEN

         10 TEN

SQL>

در جداول t1 و t3 با توجه به این که تعداد سطرهای 20و 30 برابر بودند، فقط سطرهای 10 به عنوان خروجی نمایش داده شدند.

بررسی INTERSECT ALL

دستور INTERSECT سطر های مشترک در مجموعه ها را به نمایش می دهد. در حالت عادی این عملکر نیز سطرهای تکراری را حذف می کند.

select record_type, description

from   t1

intersect

select record_type, description

from   t2

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         20 TWENTY

         30 THIRTY

SQL>

در صورتی که از دستور INTERSECT ALL استفاده گردد رکوردهای تکراری حذف نخواهند شد و تعداد سطرهای خروجی به ازای سطر های مشترک خواهد بود ( به خروجی دستورات زیر توجه کنید )

select record_type, description

from   t1

intersect all

select record_type, description

from   t2

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         20 TWENTY

         30 THIRTY

SQL>

select record_type, description

from   t1

intersect all

select record_type, description

from   t3

order by 1;

RECORD_TYPE DESCRIPTION

———– ————

         20 TWENTY

         20 TWENTY

         30 THIRTY

         30 THIRTY

SQL>

دستورات EXCEPT  و ALL EXCEPT

دستورات فوق معادل MINUS و MINUS ALL می باشند که در دیگر پایگاه داده ها قابل استفاده بودند که اوراکل در نسخه 21C امکان استفاده از این دو دستور را نیز فراهم کرده.