2011-08-03 50 views

回答

0

該查詢是加入2表作業和地址。這些表正在字段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 

看到一個視覺圖片加入http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

+0

這是一個很好的,完全覆蓋的答案。非常感謝。 –

+0

a.sel_code(+)='H'是什麼意思? –

+0

地址字段中的sel_code需要等於H.只要(+)是舊的OUTER JOIN語法,不應再使用它。這裏有一個關於它的SO問題 - http://stackoverflow.com/questions/430274/oracle-what-does-do-in-a-where-clause – Taryn

4

該查詢選擇不具有匹配的地址記錄或者每JOB.IP_NUM這可能是有用的匹配的地址記錄具有不等於'H'的SEL_CODE。

(+)是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> 

注意,如果我們不包括在產生額外條款的加入,但離開它的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查詢。

+0

非常感謝@APC。你很棒。 –