loading..
Русский    English
00:25
листать

Упражнение 71

Найти тех производителей ПК, все модели ПК которых имеются в таблице PC

Вот типичный неверный запрос

Консоль
Выполнить
  1. SELECT DISTINCT maker
  2. FROM Product
  3. WHERE model IN (SELECT model FROM PC);
который сопровождается следующим вопросом: "Производитель E с моделью 1260 присутствует и в таблице PC, а правильный результат его не содержит. Почему?"

Ключевым моментом формулировки является слово "ВСЕ". Давайте посмотрим на модели производителя E. Модели ПК, которые выпускает производитель E, дает следующий запрос:

Консоль
Выполнить
  1. SELECT model
  2. FROM Product
  3. WHERE maker='E' AND type='PC';

Результат:

model
1260
2111
2112

А теперь проверим, какие из этих моделей имеются в таблице PC:

Консоль
Выполнить
  1. SELECT DISTINCT model
  2. FROM PC
  3. WHERE model IN(1260, 2111, 2112);

Оказывается, что из трех моделей только одна - 1260 - имеется в таблице PC. По условию же задачи там должны находиться ВСЕ три модели производителя E.

Собственно, решение этой задачи сводится к операции реляционного деления, только для каждого производителя у нас свой делитель (его модели). В упрощенном виде операцию реляционного деления можно записать так:

  1. A(a, b) DIVIDEBY B(b)
где делимое (А) представляет собой бинарное (двухатрибутное) отношение, а делитель (B) - унарное. Результатом являются такие значения из первого атрибута отношения A, для каждого из которых значения второго атрибута содержат ВСЕ значения делителя.

Операция реляционного деления не является примитивной. Это означает, что эту операцию можно выразить через другие (примитивные) реляционные операции. Избыточность реляционной алгебры, предложенной Коддом, обусловлена ориентаций на практическое применение. Язык  Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL тоже избыточен, в чем нас убеждает каждая задача, которую можно решить разными способами. Несмотря на это, аналога операции реляционного деления в нем нет. :-)

В заключение приведу представление реляционного деления, выраженного через другие операции.

  1. A DIVIDEBY B :=
  2. A[a] EXCEPT ((A[a] TIMES B) EXCEPT A) [a]

Здесь A[a] означает проекцию отношения A на атрибут a; TIMES - декартово произведение. "Подстрочный" перевод на язык SQL может выглядеть следующим образом:

Консоль
Выполнить
  1. SELECT a FROM A
  2. EXCEPT
  3. SELECT a FROM (
  4. SELECT A.a, B.b FROM A, B
  5. EXCEPT
  6. SELECT a,b FROM A) X;

Не следует использовать этот подстрочник как руководство к действию; есть более простые способы решить задачу. Впрочем, я не настаиваю. :-)

Решить задачу на SQL-EX.RU

Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
вчера
продать contact
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.