|
Программирование >> Хронологические базы данных
NULL-значения в столбце SI) имеют совершенно различные интерпретации. Значения TOTQTY различаются в зависимости от того, относятся ли они к строкам по поставшикам или к строкам по деталям. Так каким же может быть предикат для такого отношения ? Отметим, что NULL-значения в этом результате представляют еще и некоторый другой вид отсутствующей информации . Они, определенно, не означают, что значение неизвестно или значение не используется , но что конкретно они означают, соверщенно неясно. Замечание. В языке SQL предоставляется возможность отличить эти новые NULL-значения от других видов, но детали такой процедуры весьма утомительны. Пользователь вынужден рассматривать вьтолнение операции с таблицей как последовательность операций, обрабатывающих по одной строке. Здесь мы опускаем подробности, однако некоторое представление можно получить, рассмотрев следующий пример (он показывает, что приведенный выше пример с опцией GROUPING SETS на практике может выглядеть несколько иначе). SELECT CASE GROUPING (SI) WHEN 1 THEN ????? ELSE SI AS Si, CASE GROUPING (Pl) WHEN 1 THEN !!!!!! ELSE PI AS PI, SUM(QTY) AS TOTQTY FROM SP GROUP BY GROUPING SETS ( (Si) ~ CM. приложение A no CASE ~ CM. приложение A no CASE Возвратимся к предложению GROUP BY. Две другие опции предложения GROUP BY, ROLLUP и CUBE, по сути являются сокращениями для определенных сочетаний в предложении GROUPING SETS. Сначала рассмотрим опцию ROLLUP. SELECT Si, Pi, SUM(QTY) AS TOTQTY FROM SP GROUP BY ROLLUP ( Si, Pl ) ; Предложение GROUP BY в данном случае будет равносильно следующему. GROUP BY GROUPING SETS ( (Si,Pl), (SI), () ) ; Другими словами, этот запрос объединяет формулировки запросов 4, 2 и L Результат его выполнения выглядит так.
Термин ROLLUP (накопить) принят из-за того, что в данном примере количества накапливаются для каждого поставщика (т.е. накапливаются по размерности поставщика ; см. приведенный ниже подраздел Многомерные базы данных ). В общем, предложение GROUP BY ROLLUP (А,В, ... Z), или, проще говоря, накопить по размерности А , означает сгруппировать по всем следующим сочетаниям . {А,В, ...,Z) {А.В) Обратите внимание, что в общем случае выполняется много отдельных накоплений по размерности А (это зависит от того, как перечислены в списке ROLLUP другие столбиьО-Также отметим, что предложения GROUP BY ROLLUP (А,В) и GROUP BY ROLLUP (В,А) имеют различные значения, т.е. предложение GROUP BY ROLLUP (А,В) не симметрично относительно А и В. А теперь рассмотрим опцию CUBE. В качестве примера возьмем следующее. SELECT Si, Pi, SUM(QTY) AS TOTQTY FROM SP GROUP BY CUBE ( Si, PI ) ; Предложение GROUP BY здесь будет логически эквивалентно предложению, приведенному ниже. GROUP BY GROUPING SETS ( (Si,Pi), (SI), (Pi), () ) ; Другими словами, этот запрос объединяет формулировки всех четырех запросов: 4, 3, 2 и 1. Результат его выполнения выглядит так.
Бесполезный термин CUBE (куб) был принят из-за того, что в терминологии технологии OLAP, по крайней мере в многомерной, значения данных могут восприниматься как хранимые в ячейках многомерного массива или гиперкуба. В нашем слу- чае значения данных - это количества; куб имеет лишь два измерения - измерение поставщиков и измерение деталей (такой куб лучше бы назвать плоскостью!); эти два измерения имеют неравные размеры (так что данный куб даже не является квадратом; скорее, это прямоугольник). Но как бы то ни было, предложение GROUP BY CUBE (А,В, ... Z) означает сгруппировать по всем возможным подмножествам множества {А, В, zy\ Любое предложение GROUP BY может включать произвольные сочетания опций GROUPING SETS, ROLLUP и CUBE. Многокоординатные таблицы Продукты OLAP часто отображают результаты запросов не в виде SQL-таблиц, а в виде многокоординатных таблиц или перекрестных таблиц (cross tabulation, или сокращенно - crosstab). Вновь рассмотрим запрос 4. ( Определить общее количество поставок по поставщикам и деталям ). Ниже представлены результаты его выполнения в виде многокоординатной таблицы. Отметим, кстати, что количества детали с номером Р1 для поставщиков с номерами S3 и S4 показаны (корректно) как нуль. В языке SQL, напротив, для этих количеств мы бы получили NULL-значения (см. главу 18). В действительности таблица, которая выдается в языке SQL в ответ на запрос 4, не содержит строк для (S3, Pl) или (S4, Р1), поэтому создать из нее многокоординатную таблицу - отнюдь непростая задача. Эта многокоординатная таблица, безусловно, предоставляет более компактный и наглядный способ представления результата выполнения запроса 4. Кроме того, она несколько похожа на реляционную таблицу. Обратите внимание, что количество столбцов в этой таблице зависит отреачьных данных, а точнее, для каждого вида детали имеется один столбец, и поэтому структура многокоординатной таблицы и значение строк зависят от реальных данных. Следовательно, многокоординатная таблица- это не отношение, а отчет; точнее - отчет, который отформатирован, как простой массив. (Отношения имеют предикат, который можно вывести из предикатов отношений, производными которых они являются. Однако предикат для многокоординатной таблицы (если сделать допущение, что таковой существует) не может быть производным от предикатов соответствующих отношений, поскольку, как мы убедились, многокоординатная таблица зависит от значений данных.) О многокоординатных таблицах, подобных показанной выше, часто говорят, что они имеют два измерения; в данном случае это поставщики и детали. Измерения обрабатываются, как будто это независимые переменные, а ячейки на пересечениях содержат значения соответствующих зависимых переменных. Дальнейшие пояснения изложены в подразделе Многомерные базы данных . Ниже приведен другой пример многокоординатной таблицы, которая представляет собой результат примера с опцией CUBE.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |