Это правильный запрос?Если это то, что это значит - PullRequest
0 голосов
/ 03 августа 2011

Мне дали запрос, чтобы объяснить. Может кто-нибудь, пожалуйста, объясните мне:

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 ]

4 голосов
/ 03 августа 2011

Этот запрос выбирает каждый 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.

0 голосов
/ 03 августа 2011

В запросе объединяются 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...