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。你很棒。