تا قبل از نسخه 21c، صرفا می توانستیم از سه عملگر مجموعه ای INTERSECT، MINUS و UNION [ALL] در اوراکل استفاده کنیم اما در نسخه 21c دو عملگر جدید EXCEPT و EXCEPT ALL به این مجموعه اضافه شدند که این دو عملگر معادل عملگرهای MINUS و MINUS ALL هستند و صرفا به دلیل استفاده از عبارتهای EXCEPT و EXCEPT ALL در دیتابیسهای دیگر، اوراکل هم این دو عملگر را به مجموعه عملگرهای خود اضافه کرده است.
مجددا تاکید می شود که در عمل تفاوتی بین EXCEPT و MINUS وجود ندارد و حتی در صورت استفاده از عملگر EXCEPT، اوراکل در زمان اجرای پرس و جو، در مرحله Query Transformation، عملگر EXCEPT را به MINUS تبدیل می کند.
با این توضیحات، در شرایط زیر، برای برگرداندن رکوردهایی که در t1.c1 وجود دارند اما در t2.c1 وجود ندارد(با حذف رکوردهای تکراری!!) دو انتخاب داریم، عملگرEXCEPT و عملگر MINUS:
select t1.c1 from t1 MINUS select t2.c1 from t2; D Z select t1.c1 from t1 EXCEPT select t2.c1 from t2; D Z
با فعال کردن تریس هم خواهیم دید که در زمان استفاده از عملگر EXCEPT، اوراکل کماکان از عملگر MINUS استفاده می کند:
user_id=0 user_name=SYS module=sqlplus@oLinux7 (TNS V1-V3) action= sql_id=3tkx1k2a2pphc plan_hash_value=1699042171(6545537b) problem_type=3 command_type=3 ----- Current SQL Statement for this session (sql_id=3tkx1k2a2pphc) ----- select t1.c1 from t1 EXCEPT select t2.c1 from t2 Final query after transformations:******* UNPARSED QUERY IS ******* (SELECT "T1"."C1" "C1" FROM "SYS"."T1" "T1")MINUS (SELECT "T2"."C1" "C1" FROM "SYS"."T2" "T2")
در نسخه 21c، علاوه بر اضافه شدن دو عملگر EXCEPT و EXCEPT ALL، امکان استفاده از کلمه کلیدی ALL به همراه دو عملگر INTERSECT و MINUS هم فراهم شده تا از حذف رکوردهای تکراری در زمان نمایش خروجی جلوگیری شود. در ادامه با ارائه مثالی، بیشتر با این تغییرات آشنا خواهیم شد.
دو مجموعه زیر را در نظر بگیرید:
در صورت استفاده از شرط t2.c1 MINUS t1.c1، صرفا رکوردهایی از t2.c1 که در t1.c1 موجود نیستند نمایش داده خواهند شد البته بعد از محاسبه تفاوت این دو مجموعه، رکوردهای تکراری حذف خواهند شد.
برای مثال، دو رکورد از مجموعه t2.c1 شامل کارکتر F هستند اما هیچ یک از رکوردها در مجموعه t1.c1 شامل کارکتر F نمی باشند. در این شرایط، عملگر MINUS (یا EXCEPT) در زمان نمایش خروجی، رکوردهای تکرار را حذف می کند و کارکتر F را صرفا یکبار نمایش خواهد داد:
SQL> select t2.c1 from t2 MINUS select t1.c1 from t1; E F
در این شرایط، اگر در نظر دارید از حذف رکوردهای تکراری جلوگیری کنید، می توانید از عبارت ALL به همراه عملگر MINUS استفاده کنید برای مثال، با تغییر عملگر MINUS به MINUS ALL، کارکتر F دو بار در خروجی نمایش داده می شود:
select t2.c1 from t2 MINUS ALL select t1.c1 from t1; E F F
این قائده برای INTERSECT و INTERSECT ALL هم صادق است که در جدول زیر مثالهایی را برای هر یک از این عملگرها مشاهده می کنید:
بهترینی