در نسخه 23c می توان از Column Alias در قسمت GROUP BY و HAVING استفاده کرد. این امکان تا قبل از نسخه 23c وجود نداشت:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
SQL> select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB 2 from dba_segments 3 group by Malek 4 having SIZE_MB>100; ERROR at line 4: ORA-00904: "SIZE_MB": invalid identifier
در نسخه 21c برای جلوگیری از خطای invalid identifier فوق، می بایست Alias ستون را حذف و کوئری را به صورت زیر بازنویسی کرد:
select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB from dba_segments group by owner having sum(bytes / 1024 / 1024) > 10;
در نسخه 23c هر دو پرس و جوی فوق قابل اجرا هستند و می توانیم از “SIZE_MB” به جای …sum استفاده کنیم:
Connected to Oracle Database 23c Free, Release 23.0.0.0.0
SQL> select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB 2 from dba_segments 3 group by Malek 4 having SIZE_MB>100; MALEK SIZE_MB ------ ---------- sys 672
در نسخه 23c، قابلیت دیگری هم در این زمینه ایجاد شد که آن هم استفاده از شماره ستون در قسمت GROUP BY است برای استفاده از این قابلیت، باید پارامتر group_by_position_enabled را به مقدار TRUE تنظیم کنیم:
SQL> select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB from dba_segments group by 1 having SIZE_MB > 100; ERROR at line 1: ORA-00979: "OWNER": must appear in the GROUP BY clause or be used in an aggregate function
SQL> alter session set group_by_position_enabled=true; Session altered.
SQL> select lower(owner) as Malek, sum(bytes / 1024 / 1024) as SIZE_MB from dba_segments group by 1 having SIZE_MB > 100; MALEK SIZE_MB ------ ---------- sys 672
خیلی جالب بود