Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OraLessons-I / Les-05-Displaying Data from Multiple Tables.doc
Скачиваний:
20
Добавлен:
20.03.2015
Размер:
153.6 Кб
Скачать

2.8 Не-эквисоединение.

Не-эквисоединение– это условие соединения, которое содержит оператор, отличный от оператора равенства.

EMPLOYEES

JOB_GRADES

LAST_NAME

SALARY

GRADE_LEVEL

LOWEST_SALARY

HIGHEST_SALARY

King

24000

A

1000

2999

Kochhar

17000

B

3000

5999

De Haan

17000

C

6000

9999

Hunold

9000

D

10000

14999

Ernst

6000

E

15000

24999

Lorentz

4200

F

25000

40000

Mourgos

5800

Rajs

3500

Davies

3100

Matos

2600

Vargas

2500

Зарплата в таблице EMPLOYEES находится в пределах минимального и максимального значений в таблице JOB_GRADES.

Zlotkey

10500

Abel

11000

Taylor

8600

. . .

Отношение между таблицами EMPLOYEES и JOB_GRADES не является эквисоединением, т.к. ни один столбец таблицы EMPLOYEES не соответствует точно какому-либо столбцу в таблице JOB_GRADES. Связь между таблицами такова, что значение столбца SALARY в таблице EMPLOYEES находится между значениями столбцов LOWEST_SAL и HIGHEST_SAL таблицы JOB_GRADES. Для такого соединения оператор «равно» (=) использоваться не может.

Пример.

SELECT e.last_name, e.salary, j.grade_level

FROM employees e JOIN job_grades j

ON e.salary

BETWEEN j.lowest_salary AND j.highest_salary ;

2.9 Внешние соединения.

  1. В соответствие со стандартом SQL:1999 внутреннее соединение– это соединение двух таблиц, возвращающее только те строки, которые соответствуют условию соединения.

  2. Соединение двух таблиц, которое возвращает как строки внутреннего соединения, так и несоответствующие строки левой (правой) таблицы – это левое (правое) внешнее соединение.

  3. Полное внешнее соединениевозвращает результаты внутреннего соединения, а также левого и правого внешних соединений.

2.9.1 Левое внешнее соединение.

SELECT e.last_name, e.department_id, d.department_name

FROM employees e LEFT OUTER JOIN departments d

ON (e.department_id = d.department_id) ;

В этом запросе возвращаются все строки таблицы EMPLOYEES, даже если они не соответствуют строкам таблицы DEPARTMENTS, т.к. таблица EMPLOYEES является левой таблицейво внешнем соединении.

В предыдущих версиях СУБД Oracle (до версии 8i) этот запрос выглядел бы так:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE e.department_id = d.department_id(+) ;

2.9.2 Правое внешнее соединение.

SELECT e.last_name, e.department_id, d.department_name

FROM employees e RIGHT OUTER JOIN departments d

ON (e.department_id = d.department_id) ;

В этом запросе возвращаются все строки таблицы DEPARTMENTS, даже если они не соответствуют строкам таблицы EMPLOYEES, т.к. таблица DEPARTMENTS является правой таблицейво внешнем соединении.

В предыдущих версиях СУБД Oracle (до версии 8i) этот запрос выглядел бы так:

SELECT e.last_name, e.department_id, d.department_name

FROM employees e, departments d

WHERE e.department_id (+) = d.department_id ;

Соседние файлы в папке OraLessons-I