Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Конструкция for update

Конструкция for update предназначена для указания серверу, что результат запроса в дальнейшем может редактироваться.

Пример:

begin work 'm_w' table BOOK; select UDC, NAME from BOOK for update; // Изменяем данные ... commit work 'm_w';

Одна и та же таблица может быть выбрана посредством select for update только одним пользователем, то есть пока пользователь не закончит работу (оператором commit или rollback), любой другой пользователь будет вынужден ждать.

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

Иногда необходимо получить всю информацию из одной таблицы и некоторую информацию из связанной с ней таблицы для тех строк, для которых такая информация существует. Эта операция называется внешним соединением таблиц. Такое соединение не отбрасывает записи только по той причине, что им нет парных. Операция внешнего соединения записывается специальным способом: вместо знака = применяются *= или =* или **.

Знак операции

Назначение

=*

Отбор всех записей из левой таблицы и отбор соответствующих записей из правой таблицы, если такие записи есть.

*=

Отбор всех записей из правой таблицы и отбор соответствующих записей из левой таблицы, если такие записи есть.

**

Отбор всех записей из обеих таблиц. Если есть соответствие между записями, то они будут объединены.

=

Отбор только тех записей, которые соответствуют друг другу.

Независимо от записи связь между полями остается прежней: по равенству.

Приведем пример работы с внешним соединением. Выберем из двух таблиц – BOOK и REPORT все записи так, чтобы были выбраны все книги, а также статьи, у которых автор статьи и книги одинаковый, если таковые есть.

Пример:

select    b.NAME as BOOKNAME,    r.NAME as ARTICLE from    BOOK b, REPORT r where    b.ID_AUTHOR =* r.ID_AUTHOR;

Рисунок 1. Выборка данных. Отбор всех записей из таблицы BOOK

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

Пример:

select    b.NAME as BOOKNAME,    r.NAME as ARTICLE from    BOOK b, REPORT r where    b.ID_AUTHOR *= r.ID_AUTHOR;

Рисунок 2. Выборка данных. Отбор всех записей из таблицы REPORT

Если не использовать внешнее соединение, результаты выборки будут следующие:

select    b.NAME as BOOKNAME,    r.NAME as ARTICLE from    BOOK b, REPORT r where    b.ID_AUTHOR = r.ID_AUTHOR;

Рисунок 3. Выборка данных без использования внешнего соединения

Если произвести отбор всех записей из обеих таблиц, то результат будет следующим:

select    b.NAME as BOOKNAME,    r.NAME as ARTICLE from    BOOK b, REPORT r where    b.ID_AUTHOR ** r.ID_AUTHOR;

Рисунок 4. Выборка данных. Отбор всех записей из таблиц BOOK и REPORT

Работа с кодификаторами

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

Кодификатор – упорядоченные пары {ключ:толкование}, статически загруженные в память. Используются для расширенного толкования значений ключа при операциях чтения результатов. Перед использованием кодификатор должен быть загружен в память. Исходными данными для кодификатора служит обычная таблица HyTech. При загрузке указывается номер поля, используемого в качестве ключа кодификатора, и поле таблицы, трактуемое как толкование значения ключа. Поле, используемое как толкование, должно быть символьного типа. Если есть мало изменяющаяся таблица, каждая запись которой содержит пару «ключ-толкование», то такую таблицу можно загрузить в память сервера в качестве кодификатора (SQL-функция coderload). Теперь вместо операции join можно просто «расшифровывать» записи во время чтения.

Пример:

if (table_exists('TMP') > 0) drop table TMP; create table TMP (   MSG char(50) ); declare variable @nCode; coderunload("PHOUSE"); @nCode = coderload("PHOUSE", 1, 3); if (@nCode != 0) {   insert into TMP values (" Произошла ошибка " + @nCode);   fix TMP;   select * from TMP;   quit; } fix all; select   coder("PHOUSE", ID_PH) as PUBLISHER,   NAME                   as BOOKNAME from   BOOK;

Результаты выборки данных сиспользованием кодификатора приведены на рисунке 1.

Рисунок 1. Результаты выборки данных с использованием кодификатора

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