私は説明するための質問が与えられました。誰かがそれを私に説明してください:これは正しいクエリですか?それが何であれば、
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に参加していますが、ジョブテーブルに存在するがアドレステーブルには存在しないレコードを探しています。
これは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
合流見るために役に立つかもしれません、一致するアドレスレコード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つのレコードを取得します0SQL> 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クエリ。
ありがとう@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