Oracle 这是一个正确的问题吗?如果是,那是什么意思

Oracle 这是一个正确的问题吗?如果是,那是什么意思,oracle,Oracle,有人向我提出了一个要解释的问题。有人能给我解释一下吗: select j.ip_num from jobs j, address a where j.jobtype='C' and a.sel_code(+)='H' and j.ip_num=a.ip_num and a.ip_num is null order by a.ip_num 查询正在联接两个表jobs和address。这些表在字段ip_num上连接,但您正在查找作业表中存在但地址表中不存在的记录 这是一个左外连接。也可以编写此

有人向我提出了一个要解释的问题。有人能给我解释一下吗:

select j.ip_num from 
jobs j, address a
where j.jobtype='C' and
a.sel_code(+)='H' and 
j.ip_num=a.ip_num and
a.ip_num is null order by a.ip_num

查询正在联接两个表jobs和address。这些表在字段ip_num上连接,但您正在查找作业表中存在但地址表中不存在的记录

这是一个左外连接。也可以编写此查询

SELECT j.ip_num 
FROM jobs j
LEFT OUTER JOIN address a
    ON j.ip_num=a.ip_num
WHERE j.jobtype='C' AND
    a.sel_code(+)='H' AND 
    a.ip_num is null 
ORDER BY a.ip_num

查看可视图片连接可能会很有用。查询正在连接两个表作业和地址。这些表在字段ip_num上连接,但您正在查找作业表中存在但地址表中不存在的记录

这是一个左外连接。也可以编写此查询

SELECT j.ip_num 
FROM jobs j
LEFT OUTER JOIN address a
    ON j.ip_num=a.ip_num
WHERE j.jobtype='C' AND
    a.sel_code(+)='H' AND 
    a.ip_num is null 
ORDER BY a.ip_num

查看一张可视图片可能会很有用,该查询会选择没有匹配地址记录或匹配地址记录的选择代码不等于“H”的每个JOB.IP_NUM

(+)
是Oracle旧的外部联接语法。它是9i之前的Oracle版本中唯一支持的外部联接语法

在这个查询中,我们为EMP中匹配部门的每一行获取一行,再加上DEPTNO=40的一行,该行没有员工:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       , emp e
  5  where d.deptno = e.deptno(+)
  6  /

DNAME          ENAME
-------------- ----------
ACCOUNTING     SCHNEIDER
ACCOUNTING     BOEHMER
ACCOUNTING     KISHORE
RESEARCH       ROBERTSON
RESEARCH       KULASH
RESEARCH       GASPAROTTO
RESEARCH       RIGBY
RESEARCH       CLARKE
SALES          HALL
SALES          CAVE
SALES          SPENCER
SALES          BILLINGTON
SALES          PADFIELD
SALES          VAN WIJK
SALES          KESTELYN
SALES          LIRA
OPERATIONS     PSMITH
HOUSEKEEPING   VERREYNNE
HOUSEKEEPING   FEUERSTEIN
HOUSEKEEPING   PODER
HOUSEKEEPING   TRICHLER
COMMUNICATIONS

22 rows selected.

SQL> 
现在,如果我们像这样在EMP表上添加一个额外的过滤器,我们只需为每个部门获取一条记录,因为EMP中现在只有一条记录匹配:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       , emp e
  5  where d.deptno = e.deptno(+)
  6  and e.ename(+) = 'CAVE'
  7  /

DNAME          ENAME
-------------- ----------
ACCOUNTING
RESEARCH
SALES          CAVE
OPERATIONS
HOUSEKEEPING
COMMUNICATIONS

6 rows selected.

SQL> 
/
要将此查询转换为ANSI SQL语法,我们必须执行以下操作:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       left outer join emp e
  5          on ( d.deptno = e.deptno
  6               and e.ename = 'CAVE' )
  7  /

DNAME          ENAME
-------------- ----------
ACCOUNTING
RESEARCH
SALES          CAVE
OPERATIONS
HOUSEKEEPING
COMMUNICATIONS

6 rows selected.

SQL>
请注意,如果我们不在联接中包含additional子句,而将其保留在WHERE子句中,则会得到不同的结果:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       left outer join emp e
  5          on ( d.deptno = e.deptno )
  6  where  e.ename = 'CAVE'
  7  /

DNAME          ENAME
-------------- ----------
SALES          CAVE

SQL>

这相当于在第二个旧skool查询中省略
(+)

该查询选择每个没有匹配地址记录或匹配地址记录的SEL_代码不等于“H”的JOB.IP_NUM

(+)
是Oracle旧的外部联接语法。它是9i之前的Oracle版本中唯一支持的外部联接语法

在这个查询中,我们为EMP中匹配部门的每一行获取一行,再加上DEPTNO=40的一行,该行没有员工:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       , emp e
  5  where d.deptno = e.deptno(+)
  6  /

DNAME          ENAME
-------------- ----------
ACCOUNTING     SCHNEIDER
ACCOUNTING     BOEHMER
ACCOUNTING     KISHORE
RESEARCH       ROBERTSON
RESEARCH       KULASH
RESEARCH       GASPAROTTO
RESEARCH       RIGBY
RESEARCH       CLARKE
SALES          HALL
SALES          CAVE
SALES          SPENCER
SALES          BILLINGTON
SALES          PADFIELD
SALES          VAN WIJK
SALES          KESTELYN
SALES          LIRA
OPERATIONS     PSMITH
HOUSEKEEPING   VERREYNNE
HOUSEKEEPING   FEUERSTEIN
HOUSEKEEPING   PODER
HOUSEKEEPING   TRICHLER
COMMUNICATIONS

22 rows selected.

SQL> 
现在,如果我们像这样在EMP表上添加一个额外的过滤器,我们只需为每个部门获取一条记录,因为EMP中现在只有一条记录匹配:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       , emp e
  5  where d.deptno = e.deptno(+)
  6  and e.ename(+) = 'CAVE'
  7  /

DNAME          ENAME
-------------- ----------
ACCOUNTING
RESEARCH
SALES          CAVE
OPERATIONS
HOUSEKEEPING
COMMUNICATIONS

6 rows selected.

SQL> 
/
要将此查询转换为ANSI SQL语法,我们必须执行以下操作:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       left outer join emp e
  5          on ( d.deptno = e.deptno
  6               and e.ename = 'CAVE' )
  7  /

DNAME          ENAME
-------------- ----------
ACCOUNTING
RESEARCH
SALES          CAVE
OPERATIONS
HOUSEKEEPING
COMMUNICATIONS

6 rows selected.

SQL>
请注意,如果我们不在联接中包含additional子句,而将其保留在WHERE子句中,则会得到不同的结果:

SQL> select d.dname
  2         , e.ename
  3  from dept d
  4       left outer join emp e
  5          on ( d.deptno = e.deptno )
  6  where  e.ename = 'CAVE'
  7  /

DNAME          ENAME
-------------- ----------
SALES          CAVE

SQL>

这相当于在第二个旧skool查询中省略
(+)

这是一个很好的完全覆盖的答案。非常感谢。地址字段中的sel_代码需要等于H。至于(+),它是旧的外部连接语法,不应该再使用了。这里有一个关于它的问题,希望讨论它的另一个问题能对你有所帮助。实际上你的重写会抛出
ORA-25156:老式的外部连接(+)不能与ANSI连接一起使用
这是一个很好的完全覆盖的答案。非常感谢。地址字段中的sel_代码需要等于H。至于(+),它是旧的外部连接语法,不应该再使用了。这里有一个关于它的问题-希望讨论它的另一个问题能对你有所帮助。实际上你的重写会抛出
ORA-25156:老式的外部连接(+)不能用于ANSI连接
非常感谢@APC。你太棒了。非常感谢@APC。你很棒。