我有一个查询要解释。有人可以向我解释一下:
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
答案 0 :(得分:4)
该查询选择没有匹配的ADDRESS记录的每个JOB.IP_NUM,或者匹配的ADDRESS记录的SEL_CODE不等于'H'。
(+)
是Oracle的旧外连接语法。它是9i之前的Oracle版本中唯一支持的OUTER JOIN语法。
在此查询中,我们在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>
请注意,如果我们在JOIN中不包含additonal子句但将其保留在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查询中的(+)
。
答案 1 :(得分:0)
查询正在加入2个表作业和地址。这些表正在字段ip_num上加入,但您正在查找作业表中存在但在地址表中不存在的记录。
这是LEFT OUTER JOIN。此查询也可以写成
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
看到可视图片加入http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
可能会有用