مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۳ دقیقه·۳ سال پیش

تغییرات دستورات 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 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 امکان استفاده از این دو دستور را نیز فراهم کرده.

مطالعه مطالب بیشتر در خصوص اوراکل در سایت Artarad.ir

اوراکلdatabaseدستورات
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید