Классика баз данных - статьи

       

Независимо от того, сколько копий


Независимо от того, сколько копий каждого ti имеется в соответствующей входной таблице tablei, в результате блока SELECT DISTINCT будет содержаться, самое большее, один кортеж, спроецированный из t1, . . ., tn. Поэтому в каждом источнике можно безопасно удалять или порождать дубликаты без воздействия на результат такого блока SELECT.

Правило DISTPDTO является достаточно простым – если во всех блоках, определенных над данным блоком, указано их безразличие к числу дубликатов, производимых их источниками, то в этом блоке могут каким угодно образом вводиться или удаляться дубликаты, и, следовательно, флаг distinct тела этого блока можно установить в PERMIT, а флаг distinct его заголовка – в FALSE.

Отметим использование локальности правила: в этой задаче участвуют два блока, и поэтому она разбивается на два отдельных правила с использованием информации, передаваемой между блоками через квантификатор. При выполнении проталкивания атрибута DISTINCT каждая операция должна заниматься только своим собственным поведением без потребности знать что бы то ни было про другие операции, участвующие в этой активности. Заметим также, что, если обработка останавливается после DISTPDFR, но перед DISTPDTO, граф OGM остается согласованным и допустимым.

Правило 4. E or A Distinct Pushdown From

Это правило (таб. 6) является частным случаем выталкивания distinct «из»; в правиле используется тот факт, что квантификация кванторами существования или всеобщности слепа к дубликатам. Другими словами, несущественно число кортежей в подзапросе, которые удовлетворяют предикату с квантором существования; для таких предикатов требуется соответствие только одного кортежа подзапроса. Аналогично, число дубликатов в подзапросе не имеет значения для предиката с квантором всеобщности; либо все кортежи в подзапросе удовлетворяют такому предикату, либо он в целом не удовлетворяется.



Таб. 6. Правило 4 – EorAPDFR

Пример 2.

CREATE VIEW richemps AS (SELECT DISTINCT empno, salary, workdept FROM employee WHERE salary > 50000);


Содержание  Назад  Вперед