Соединение таблиц Назад В начало Вперед

В простейшем случае логическая таблица может состоять из одной физической таблицы. В демонстрационном проекте к таким простым объектам относятся каталог подразделений и каталог должностей. Однако чаще всего объект имеет сложную структуру. Так, при описании объекта "Сотрудник" используются объекты "Каталог подразделений" и "Каталог должностей". Соответственно, в логической таблице для работы с данными по сотрудникам используются три физические таблицы.

Для согласованной обработки данных из нескольких таблиц используется операция соединения (join). Соединение выполняется исходя из связей между элементами данных в таблицах.

Связи описываются предикатами в конструкции where оператора create view. На языке VIP такие предикаты принято называть подцепками. При соединении любых двух таблиц связываемые поля одной таблицы располагаются слева (левая или родительская таблица) от оператора сравнения, поля другой таблицы - справа (правая или подчиненная таблица).

Корневой таблицей называется таблица, которая не подцеплена ни к одной таблице. Другими словами, в данной логической таблице корневая таблица ни для кого не является правой. Количество корневых таблиц не ограничено.

Каждая подцепка устанавливает соответствие между отдельным полем левой таблицы и соответствующим ему полем правой таблицы.

Если у правой таблицы имеется индекс, начинающийся со связываемых полей, то он используется для поиска записей, включаемых в выборку. В этом случае подцепка косвенным образом определяет сортировку записей в выборке.

Если подходящего индекса нет, необходимо поставить атрибут noIndex. В этом случае подцепка будет работать как фильтр (записи отбираются в выборку перебором).

Если для соединяемых таблиц описана ссылочная целостность, то нет необходимости описывать данное соединение в логической таблице. Соответствующие таблицы и их подцепка будут добавлены в логическую таблицу автоматически, как только компилятор встретит в тексте программы оператор ссылки "->".

Так, если в приведенном примере (см."Пример логической таблицы. ") в таблице "Картотека сотрудников" поля cDepartment и cPost описаны следующим образом:

cDepartment : ref(KatDeps)  restrict "Подразделение",
cPost	 : ref(KatPosts) restrict "Должность"

то из логической таблицы можно убрать подцепки

  and KatPersons.cDepartment == KatDeps.NRec
  and KatPersons.cPost	 == KatPosts.NRec

Названия отдела и должности в этом случае получаются не по имени поля (KatDeps.Name и KatPosts.Name), а по ссылке: KatPersons.cDepartment->Name и KatPersons.cPost->Name соответственно. Однако, если потребуется номер поля, то соответствующая константа образуется с использованием имени подцепляемой таблицы: tnKatPersons_cDepartment_KatDeps.Name и tnKatPersons_cPost_KatPosts.Name соответственно. Пример использования указанных конструкций имеется в "GetPerson. Интерфейс работы с картотекой исполнителей. ".

Таким образом, использование ссылочной целостности повышает компактность исходного кода и его читаемость.

Подцепки могут быть двух типов - жесткие (inner - внутреннее соединение) и мягкие (left outer - левое внешнее соединение).

При жесткой подцепке записи левой таблицы, для которых не были найдены записи в правой таблице, в выборку не попадают.

При мягкой подцепке таблиц отсутствующие в подцепляемой таблице записи заполняются значениями по умолчанию.

Например, пусть из таблиц "Картотека сотрудников" и "Каталог подразделений" требуется сформировать логическую таблицу, содержащую имя сотрудника и отдел, в котором он работает.

При жесткой подцепке:

KatPersons.cDepartment /== KatDeps.NRec

сформируется выборка:

Фамилия

Отдел

Иванов

2-й отдел

Сидоров

1-й отдел

При мягкой подцепке:

KatPersons.cDepartment == KatDeps.NRec

сформируется выборка:

Фамилия

Отдел

Иванов

2-й отдел

Смирнов

 

Сидоров

1-й отдел

Связи логической таблицы можно представить в виде графа, узлами которого являются физические таблицы, а дугами - отношения между ними. Реляционный граф логической таблицы является ориентированным графом без циклов. Ориентация дуг (направление подцепок) задается при описании логической таблицы.

Кроме подцепок при объединении физических таблиц в логическую используются фильтры. Фильтры накладывают дополнительные ограничения, не связанные с реляцонными отношениями таблиц. Фильтры не требуют наличия индексов.