这是一个正确的查询吗?如果它是什么意思

时间:2011-08-03 11:53:00

标签: 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

2 个答案:

答案 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

可能会有用