Oracle移植自然JOIN

Oracle porting natural JOIN

我正在审查以前同事编写的代码。它使用了“自然连接”,我不熟悉也从未使用过。

我想将其更改为 JOIN inner, outer, left ......无论正确的等价物是什么,它都显示了实际连接的内容。

下面是我的测试用例。任何帮助将不胜感激。


create table holidays(
          holiday_date DATE not null,
          holiday_name VARCHAR2(20),
          constraint holidays_pk primary key (holiday_date),
          constraint is_midnight check ( holiday_date = trunc ( holiday_date ) )
        );

INSERT into holidays (HOLIDAY_DATE,HOLIDAY_NAME)
        WITH dts as (
          select to_date('25-NOV-2021 00:00:00','DD-MON-YYYY HH24:MI:SS'), 'Thanksgiving 2021' from dual union all
          select to_date('29-NOV-2021 00:00:00','DD-MON-YYYY HH24:MI:SS'), 'Hanukkah 2021' from dual
        )
        SELECT * from dts;

SELECT constraint_name, constraint_type, column_name
from user_constraints  natural join user_cons_columns
where table_name = 'HOLIDAYS';

CONSTRAINT_NAME    CONSTRAINT_TYPE    COLUMN_NAME
SYS_C0075523509    C    HOLIDAY_DATE
IS_MIDNIGHT    C    HOLIDAY_DATE
HOLIDAYS_PK    P    HOLIDAY_DATE

在自然连接中,Oracle 根据 common 列名创建一个“隐式”连接子句。如果你想切换到内部连接,你必须自己做。

自然色:

SQL> SELECT constraint_name, constraint_type, column_name
  2  from user_constraints  natural join user_cons_columns
  3  where table_name = 'EMP';

CONSTRAINT_NAME                C COLUMN_NAME
------------------------------ - --------------------
SYS_C00105284                  C EMPNO
PK_EMP                         P EMPNO

哪些列常见?让我们看看:

SQL> select column_name from all_tab_columns where table_name = 'USER_CONSTRAINTS'
  2  intersect
  3  select column_name from all_tab_columns where table_name = 'USER_CONS_COLUMNS';

COLUMN_NAME
--------------------
CONSTRAINT_NAME
OWNER
TABLE_NAME

SQL>

内:

SQL> SELECT a.constraint_name, a.constraint_type, b.column_name
  2  from user_constraints a join user_cons_columns b
  3    on a.constraint_name = b.constraint_name
  4   and a.owner = b.owner
  5   and a.table_name = b.table_name
  6  where a.table_name = 'EMP';

CONSTRAINT_NAME                C COLUMN_NAME
------------------------------ - --------------------
SYS_C00105284                  C EMPNO
PK_EMP                         P EMPNO

SQL>

好的,但是 - 我们知道得更多。当我们查询 user_cons... 视图时,它们包含我们拥有的数据,因此我们真的不需要 owner。此外,约束名称在单个模式中是唯一的,因此我们也不需要 table_name。因此,这样做:

SQL> SELECT a.constraint_name, a.constraint_type, b.column_name
  2  from user_constraints a join user_cons_columns b on a.constraint_name = b.constraint_name
  3  where a.table_name = 'EMP';

CONSTRAINT_NAME                C COLUMN_NAME
------------------------------ - --------------------
SYS_C00105284                  C EMPNO
PK_EMP                         P EMPNO

SQL>