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

18.2.11. Предикат 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 некоторыми уточнениями.

Пример 18.25

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);

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

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

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

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

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

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

Пример 18.26

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);

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

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

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

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

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

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

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

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

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

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

Пример 18.27

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);

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

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

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

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

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

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