2011-08-03 7 views

答えて

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 

視覚的な絵は、そのクエリが一致するアドレスレコードや場所を持っていないすべてのJOB.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

合流見るために役に立つかもしれません、一致するアドレスレコードSEL_CODEが 'H'に等しくない。

(+)は、Oracleの古い外部結合構文です。これは、Oracle 9iより前のバージョンでサポートされている唯一のOUTER JOIN構文です。我々は追加のフィルタを置けば、今

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> 

:このクエリで

は、我々は1つの部門に一致するEMPのすべての行の行に加え、何人の従業員を持っていないDEPTNO = 40、の行を取得します

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構文にこのクエリを変換するには:

EMPで1つのレコードだけが今一致するため、このようなEMP表の上に、我々は単に、各部門ごとに1つのレコードを取得します0

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> 

これが第二歳で(+)を省略するのと同等です:私たちは、WHERE句でそれを登録しようが、去る中のadditonal句が含まれていない場合、我々は異なる結果を得ること

注意skoolクエリ。

+0

ありがとう@APC。あなたは素晴らしい。 –

関連する問題