Разработка баз данных в Delphi. 11 Уроков

       

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


Напомним, что внутреннее соединение возвращает только те строки, для которых условие соединения принимает значение true. Иногда требуется включить в результирующий набор большее количество строк.

Вспомним, запрос вида

SELECT first_name, last_name, department

FROM employee e, department d

WHERE e.dept_no = d.dept_no

возвращает только те строки, для которых условие соединения    (e.dept_no = d.dept_no)  принимает значение true.

Внешнее соединение возвращает все строки из одной таблицы и только те строки из другой таблицы, для которых условие соединения принимает значение true. Строки второй таблицы, не удовлетворяющие условию соединения (т.е. имеющие значение false), получают значение null в результирующем наборе.

Существует два вида внешнего соединения:  LEFT JOIN  и   RIGHT JOIN.  

В левом соединении (LEFT JOIN) запрос возвращает все строки из левой таблицы (т.е. таблицы, стоящей слева от зарезервированного словосочетания “LEFT JOIN”) и только те из правой таблицы, которые удовлетворяют условию соединения. Если же в правой таблице не найдется строк, удовлетворяющих заданному условию, то в результате они замещаются значениями null.

Для правого соединения - все наоборот.

SELECT first_name, last_name, department

FROM employee e LEFT JOIN department d

  ON e.dept_no = d.dept_no


                                                             получить список сотрудников
                                                             и название их отделов,
                                                             включая сотрудников, еще
                                                             не назначенных ни в какой отдел

FIRST_NAME      LAST_NAME      DEPARTMENT               

=============== ============== =====================

Robert          Nelson         Engineering              

Bruce           Young          Software Development     

Kim             Lambert        Field Office: East Coast 

Leslie          Johnson        Marketing                


Phil            Forest         Quality Assurance

...

В данном запросе все сотрудники оказались распределены по отделам, иначе названия отделов заместились бы значением null.

А вот пример правого соединения:

SELECT first_name, last_name, department

FROM employee e RIGHT JOIN department d

  ON e.dept_no = d.dept_no
                         получить список сотрудников
                                                                     и название их отделов,
                                                                     включая отделы, в которые еще
                                                                     не назначены сотрудники

FIRST_NAME      LAST_NAME     DEPARTMENT               

=============== ============= =========================

Terri           Lee           Corporate Headquarters   

Oliver H.       Bender        Corporate Headquarters   

Mary S.         MacDonald     Sales and Marketing      

Michael         Yanowski      Sales and Marketing      

Robert          Nelson        Engineering               

Kelly           Brown         Engineering              

Stewart         Hall          Finance                  

Walter          Steadman      Finance                  

Leslie          Johnson       Marketing                

Carol           Nordstrom     Marketing                

<null>          <null>        Software Products Div.   

Bruce           Young         Software Development

...

В результирующий набор входит и отдел “Software Products Div.” (а также отдел “Field Office: Singapore”, не представленный здесь), в котором еще нет ни одного сотрудника. 


Содержание раздела