При добавлении в запрос одной таблицы, привязанной к другой, следует обратить внимание на возможность установить тип связи (JOIN):
·INNER - Используется, когда для записи в одной таблице всегда есть запись в другой. Если запись в одной таблице не найдена, то запись в другой таблице автоматически исключается из результата запроса.
·LEFT - Используется, когда для записи в первой таблице может не быть записи во второй. При этом все записи первой таблицы (которая находится в дереве на уровне выше) попадут в результат запроса.
·RIGHT - Обратное условие для LEFT. Используется, когда для записи во второй таблице может не быть записи в первой. Все записи второй таблицы (которая находится в дереве на уровне ниже) попадут в результат запроса.
В поле Связь между таблицами (JOIN) можно прописать произвольную формулу связи. Кнопка Выбрать поля для связи между таблицами позволяет выбрать поля из текущей и находящейся уровнем выше таблицы. Формула связи, как правило, задается для таблиц, не связанных по метаинформации. |
Существует возможность установить связь между таблицами вручную. Это позволяет выбрать любые две таблицы и написать произвольную формулу связи между ними.
Для этого нужно:
·нажать кнопку Показать все таблицы. Она позволяет увидеть список всех доступных таблиц./ |
|
·выбрав нужную таблицу, нажать на кнопку Связать формулой. Тогда на панели Атрибуты таблицы в секции Связь между таблицами (JOIN) появится возможность ввести формулу связи. В формуле используются внутренние имена таблиц и полей. В области для ввода формулы щелчком правой кнопкой мыши вызывается список таблиц, которые могут участвовать в формуле, и список полей для каждой таблицы. |
Рисунок 2.3.3. Ручная связь таблиц
Для оптимизации запросов на больших объемах данных в конструкторе запросов (рис. 9) предусмотрена настройка Режим связывания с вариантами автоматически, loop, hash, merge. Рекомендуется использовать LOOP.
Рядом в поле С можно указать опцию NOLOCK, что аналогично использованию SQL синтаксиса
WITH (NOLOCK)
Данная опция позволяет избежать блокировок чтения в случаях, когда существует открытая транзацкия по таблице. Если необходимо использовать данную опцию со всеми таблицами запроса, достаточно установить флажок в параметрах запроса, не прописывая опцию для каждой таблицы.
Примеры:
1.Требуется отобрать всех пациентов, и для каждого пациента посмотреть его анамнез жизни. Для этого выбираем таблицу Пациенты, а затем таблицу Анамнез жизни. Они связаны по умолчанию условием LEFT OUTER JOIN, так как не у каждого пациента может быть заполнен анамнез жизни. В результате получаем столько записей, сколько всего есть пациентов. Поля из таблицы «Анамнез жизни» для некоторых пациентов будут просто пустыми. Это означает, что анамнез для них не заполнен.
2.Требуется отобрать всех пациентов, для которых заполнен анамнез жизни. Для этого опять отбираем таблицу «Пациенты», а затем таблицу «Анамнез жизни». Они связаны по умолчанию условием LEFT OUTER JOIN, так как не у каждого пациента может быть заполнен анамнез жизни. Но мы его меняем на INNER JOIN. В результате получаем столько записей, сколько пациентов, имеющих запись в таблице Анамнез жизни.
Иногда возникает потребность в одном запросе объединить несколько таблиц, связанных с основной таблицей отношением один ко многим. Для этого существует возможность их объединения в два последовательно выполняемых SQL запроса. Чтобы это сделать, нужно для одной из таких таблиц задать вторую в поле Объединить раздела Атрибуты таблицы.
Примеры:
1.Так выглядит запрос для двух объединенных таблиц (CONSULT и ORG), связанных с общей таблицей PATIENTS:
SELECT
PATIENTS.PATIENTS_ID, ORG.ORG_ID, null DATE_CONS
FROM
PATIENTS PATIENTS
JOIN ORG ORG ON ORG.ORG_ID = PATIENTS.ORG_ID
UNION ALL
SELECT
PATIENTS.PATIENTS_ID, null ORG_ID,CONSULT.DATE_CONS
FROM
PATIENTS PATIENTS
JOIN CONSULT CONSULT ON PATIENTS.PATIENTS_ID = CONSULT.PATIENTS_ID
Поля из таблицы CONSULT были заменены выражениями со значением NULL в первом запросе, а поля из таблицы ORG – значениями NULL во втором.
2.Так выглядит обычный запрос для этих трех таблиц:
SELECT
PATIENTS.PATIENTS_ID, ORG.ORG_ID,CONSULT.DATE_CONS
FROM
PATIENTS PATIENTS
JOIN ORG ORG ON ORG.ORG_ID = PATIENTS.ORG_ID
JOIN CONSULT CONSULT ON PATIENTS.PATIENTS_ID = CONSULT.PATIENTS_ID