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

       

Пример Дейта


Этот материал взят непосредственно из [8], а пример Дейта скопирован из [3] с использованием немного другой нотации. В примерной базе данных имеются две таблицы: Suppliers (sno,city) и Parts (pno,city). Первичными ключами являются sno и pno соответственно. В каждой таблице содержится по одной строке: в Supplier имеется строка <S1, London>, а в Parts – <P1,Null>. Для детали P1 наименование города неизвестно, и, следовательно, обозначается неопределенным значением. Запрос Дейта на естественном языке выглядит следующим образом: «Получить пары sno-pno, для которых либо города поставщика и детали различны, либо городом детали не является Париж (или выполнены оба условия»). На SQL это записывается следующим образом:

Select sno, pno From Suppliers, Parts Where Suppliers.city <> Parts.city Or Parts.city <> ’Paris’;

Для заданных таблиц этот SQL-запрос возвращает пустую таблицу. Однако, как объясняет Дейт, правильным ответом является <s1, p1>. Дейт рассматривает три возможности для города детали P1: Париж, Лондон и некоторый другой город. На самом деле, имеются два уместных случая: либо город детали P1 – это Париж, либо не Париж. В первом случае условие раздела Where истинно, поскольку городом поставщика S1 является Лондон, и сравнение London <> Paris дает true. Во втором случае условие Where истинно, поскольку Parts.city <> ’Paris’ дает true. Не имеет значения то, что название города представлено неопределенным значением; кортеж <S1, P1> удовлетворяет условию запроса и должен присутствовать в ответе. Этот простой пример иллюстрирует дефект, замеченный Дейтом в SQL.



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