Шрифт:
AS
<спецификация-выбора> [WITH CHECK OPTION];
Имя просмотра уникально идентифицирует просмотр как объект базы данных. Имя не может быть тем же самым, что и имя другого просмотра, таблицы или хранимой процедуры.
Задание списка имен столбцов просмотра является необязательным, если не существует дубликатов имен в списке столбцов. По умолчанию будут использованы имена столбцов базовой таблицы (таблиц).
В случае, когда результатом соединения является появление дубликатов имен, то здесь необходимо использовать список, который будет переименовывать столбцы.
Следующий довольно безобразный пример демонстрирует, как могут появиться дубликаты имен столбцов:
CREATE VIEW VJOB_LISTING
AS
SELECT E.*,
J. J0B_C0DE,
J.JOB_TITLE
FROM EMPLOYEE E
JOIN JOB J
ON E.JOB_CODE = J.JOB_CODE ;
ISC ERROR CODE:335544351
unsuccessful metadata update
STORE RDB$RELATION_FIELDS failed
attempt to store duplicate value (visible to active transactions)
in unique index "RDB$INDEX_15"
(ISC ERROR CODE:335544351 неудачное изменение
метаданных невозможно сохранить RDB$RELATION_FIELDS
попытка сохранить дубликат значения (видимый в активных транзакциях) в уникальном индексе "RDB$INDEX_15")
Индекс RDB$INDEX_15 является уникальным индексом для имени отношения и имени поля. Столбец JOB_CODE из таблицы EMPLOYEE уже сохранен для VJOB_LISTING, отсюда и исключение.
Необходимо именовать все столбцы в этом просмотре:
CREATE VIEW VJOB_LISTING (
EMP_NO, FIRST_NAME, LAST_NAME,
PHONE_EXT, HIRE_DATE, DEPT_NO,
EMP_JOB_CODE, /* альтернативное имя */
JOB_GRADE, JOB_COUNTRY, SALARY, FULL_NAME,
JOB_JOB_CODE, /* альтернативное имя * /
JOB_TITLE)
AS
SELECT
E.*,
J. JOB_CODE,
J. JOB_TITLE
FROM EMPLOYEE E
JOIN JOB J
ON E.JOB CODE = J.JOB_CODE ;
Список также является обязательным, если список столбцов содержит какие-либо поля, полученные из выражений. Например, следующее определение будет ошибочным:
CREATE VIEW VJOB_ALTNAMES
AS
SELECT JOB_СODE || 'for ' || JOB_TITLE AS ALTNAME
FROM JOB;
ISC ERROR CODE:335544569
Invalid command
mast specify column name for view select expression
(ISC ERROR CODE:335544569 Неверная команда,
нужно задать имя столбца для выражения в операторе SELECT в просмотре)
Следующее будет правильным:
CREATE VIEW VJOB_ALTNAMES
(ALTNAME)
AS
SELECT JOB_CODE || ' for ' || JOB_TITLE
FROM JOB;
Список имен столбцов просмотра должен соответствовать порядку и количеству столбцов, указанных в операторе SELECT.
Спецификация SELECT- это обычный оператор SELECT, который может включать соединения, поля выражений, спецификации группирования и условия поиска- но не условия упорядочения.
Выходной список в предложении SELECT определяет типы, позиции и (если не заданы явно) имена столбцов просмотра.
Запрос SELECT DISTINCT также допустим.
Предложение FROM вместе с любыми предложениями JOIN или подзапросами определяет базовые таблицы просмотра.
! ! !
ПРИМЕЧАНИЕ. Выражение SELECT * FROM <отношение> допустимо, однако для просмотров не рекомендуется, если в ваших планах эффективная документируемое?. Если используется такое выражение, то порядок следования столбцов будет соответствовать порядку в базовой таблице. Важно помнить, что вам нужно использовать предложение именования столбцов (см. разд. "Задание имен столбцов просмотра").
. ! .
Вы можете включить предложение WHERE, если вам нужно задать условия поиска. Также может быть включено предложение GROUP BY вместе с необязательным предложением HAVING.
Те же самые правила, которые применяются к любым выражениям для определения полей времени выполнения в запросах, также применимы к столбцам времени выполнения в спецификациях просмотров. Выход просмотра почти такой же, что и вычисляемые столбцы в таблице. При этом вычисляемый столбец имеет свои собственные отличные эффекты в просмотре: