Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы базы Данных / Базы данных / Введение в модель данных SQL.doc
Скачиваний:
83
Добавлен:
22.03.2015
Размер:
1.93 Mб
Скачать

Предикат match

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

match_predicate ::= row_value_constructor

MATCH [ UNIQUE ] [ SIMPLE | PARTIAL | FULL ]

query_expression

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

Пусть x обозначает строку-первый операнд. Тогда:

  • Если отсутствует спецификация вида сопоставления или специфицирован тип сопоставления SIMPLE, то:

    • если значение некоторого столбца x является неопределенным, то значением условия является true;

    • если в x нет неопределенных значений, то:

      • если не указано UNIQUE, и в результате выражения запроса существует (возможно, не уникальная) строка s в такая, что x = s, то значением условия является true;

      • если указано UNIQUE, и в результате выражения запроса существует уникальная строка s, такая, что x = s, то значением условия является true;

      • в противном случае значением условия является false.

  • Если в условии присутствует спецификация PARTIAL, то:

    • если все значения в x являются неопределенными, то значение условия есть true;

    • иначе:

      • если не указано UNIQUE, и в результате выражения запроса существует (возможно, не уникальная) строка s, такая, что каждое отличное от неопределенного значение x равно соответствующему значению s, то значение условия есть true;

      • если указано UNIQUE, и в результате выражения запроса существует уникальная строка s, такая, что каждое отличное от неопределенного значение x равно соответствующему значению s, то значение условия есть true;

      • в противном случае значение условия есть false.

  • Если в условии присутствует спецификация FULL, то:

    • если все значения в x неопределенные, то значение условия есть true;

    • если ни одно значение в x не является неопределенным, то:

      • если не указано UNIQUE, и в результате выражения запроса существует (возможно, не уникальная) строка s, такая, что x = s, то значение условия есть true;

      • если указано UNIQUE, и в результате выражения запроса существует уникальная строка s, такая, что x = s, то значение условия есть true;

      • в противном случае значение условия есть false.

    • в противном случае значение условия есть false.

Примеры запросов с использованием предиката match

Все примеры этого пункта основаны на запросе "Найти номера служащих и номера их отделов для служащих, для которых в отделе со "схожим" номером работает служащий со "схожей" датой рождения" c некоторыми уточнениями.

SELECT EMP_NO, DEPT_NO

FROM EMP

WHERE (DEPT_NO, EMP_BDATE) MATCH SIMPLE

(SELECT EMP1.DEPT_NO, EMP1.EMP_BDATE

FROM EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO);

Пример 14.25. (html,txt)

Этот запрос вернет данные о служащих, про которых:

  • либо неизвестны номер отдела илидата рождения (или и то, и другое);

  • либо в отделе данного служащего работает по крайней мере еще один человек с той же датой рождения.

Если использовать предикат MATCH UNIQUE SIMPLE, то мы получим данные о служащих, про которых:

  • либо неизвестны номер отдела илидата рождения (или и то, и другое);

  • либо в отделе данного служащего работает еще один человек с той же датой рождения.

SELECT EMP_NO, DEPT_NO

FROM EMP

WHERE (DEPT_NO, EMP_BDATE) MATCH PARTIAL

(SELECT EMP1.DEPT_NO, EMP1.EMP_BDATE

FROM EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO);

Пример 14.26. (html,txt)

Этот запрос вернет данные о служащих, про которых:

  • либо неизвестны номер отдела идата рождения;

  • либо неизвестен номер отдела, но имеется по крайней мере еще один человек с той же датой рождения;

  • либо неизвестна дата рождения, но в отделе данного служащего работает по крайней мере еще один человек;

  • либо известны и номер отдела, и дата рождения, и в отделе данного служащего работает по крайней мере еще один человек с той же датой рождения.

Если использовать предикат MATCH UNIQUE PARTIAL, то мы получим данные о служащих, про которых:

  • либо неизвестны номер отдела идата рождения;

  • либо неизвестен номер отдела, но имеется еще один человек с той же датой рождения;

  • либо неизвестна дата рождения, но в отделе данного служащего работает еще один человек;

  • либо известны и номер отдела, и дата рождения, и в отделе данного служащего работает еще один человек с той же датой рождения.

SELECT EMP_NO, DEPT_NO

FROM EMP

WHERE (DEPT_NO, EMP_BDATE) MATCH UNIQUE FULL

(SELECT EMP1.DEPT_NO, EMP1.EMP_BDATE

FROM EMP EMP1

WHERE EMP1.EMP_NO <> EMP.EMP_NO);

Пример 14.27. (html,txt)

Этот запрос вернет данные о служащих, о которых:

  • либо неизвестны номер отдела идата рождения;

  • либо в отделе данного служащего работает по крайней мере еще один человек с той же датой рождения.

Если использовать предикат MATCH UNIQUE SIMPLE, то мы получим данные о служащих, о которых:

  • либо неизвестны номер отдела идата рождения;

  • либо в отделе данного служащего работает еще один человек с той же датой рождения.

Соседние файлы в папке Базы данных