我被給了一個查詢來解釋。有人可以請我解釋一下:這是一個正確的查詢?如果這是什麼意思
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
我被給了一個查詢來解釋。有人可以請我解釋一下:這是一個正確的查詢?如果這是什麼意思
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表作業和地址。這些表正在字段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
該查詢選擇不具有匹配的地址記錄或者每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查詢。
非常感謝@APC。你很棒。 –
這是一個很好的,完全覆蓋的答案。非常感謝。 –
a.sel_code(+)='H'是什麼意思? –
地址字段中的sel_code需要等於H.只要(+)是舊的OUTER JOIN語法,不應再使用它。這裏有一個關於它的SO問題 - http://stackoverflow.com/questions/430274/oracle-what-does-do-in-a-where-clause – Taryn