Этот запрос выбирает каждый JOB.IP_NUM, у которого нет соответствующей записи ADDRESS или где соответствующая запись ADDRESS имеет SEL_CODE, не равный 'H'.
(+)
- это старый синтаксис внешнего соединения Oracle. Это единственный синтаксис OUTER JOIN, поддерживаемый в версиях Oracle до 9i.
В этом запросе мы получаем одну строку для каждой строки в 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, но оставим его в предложении 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.