|
Программирование >> Построение запросов sql
в предложении имеет) больше HAVING FailureCD=1;. Поле FailureCD не может быть использовано потому что оно может иметь (и действительно значение на группу вывода. Таким образом, следующий запрос является корректным: SELECT AccountCD, MAX(Incomingdate) FROM Request WHERE FailureCD=1 GROUP BY AccountCD;. Результат запроса представлен на рис. 3.61. HAVING, чем одно
Рис. 3.61. Результат выполнения корректного запроса Как отмечалось, HAVING может использовать только аргументы, которые имеют одно значение на группу вывода. Практически ссылки на агрегатные функции - наиболее общие, но и поля (столбцы), выбранные с помощью GROUP BY, также допустимы. Например, если необходимо узнать максимальные значения начислений для абонентов с лицевыми счетами 005488 и 080047, то можно выполнить следующий запрос: SELECT AccountCD, MAX (NachislSum) FROM NachislSumma GROUP BY AccountCD HAVING AccountCD IN (005488, 080047);. Результат выполнения запроса представлен на рис. 3.62.
Рис. 3.62. Результат выполнения запроса Предположим, необходимо для каждой неисправности, с которой последняя заявка поступила позднее 31.08.2001, вывести дату поступления последней заявки, общее количество заявок, а также, сколько из них было выполнено. Для решения этой задачи запрос будет выглядеть следующим образом: SELECT FailureCD, MAX(IncomingDate),COUNT(*), Из них выполнено Count(ExecutionDate) FROM Request GROUP BY FailureCD HAVING MAX(IncomingDate) > 31.08.2001;.
Рис. 3.63. Результат выполнения запроса к таблице Request Как и условие поиска в предложении WHERE, условие поиска в предложении HAVING может дать один из трех следующих результатов: - если условие поиска имеет значение TRUE, то группа строк остается и для нее генерируется одна строка в результе запроса; - если условие поиска имеет значение FALSE, то группа строк исключается и строка в результе запроса для нее не генерируется; - если условие поиска имеет значение NULL, то группа строк исключается и строка в результе запроса для нее не генерируется. Правила обработки значений NULL в условиях поиска для предложения HAVING точно такие же, как и для предложения WHERE. Предложение HAVING всегда должно использоваться в сочетании с предложением GROUP BY, хотя синтаксис запроса SELECT не требует этого. 3.3. многотабличные и вложенные запросы СУБД Firebird поддерживает три варианта запросов к множеству таблиц с помощью одного SQL-запроса на выборку: соединения, подзапросы и объединения [18, 23]. Эти три метода поиска данных во множестве таблиц существенно отличаются друг от друга и, как правило, решают различные виды поисковых задач. Соединение используется в запросах SELECT для генерации наборов, содержащих столбцы из нескольких таблиц, которые хранят связанные данные. Множество столбцов, выбранных из каждой таблицы, называются потоками. Процесс соединения объединяет выбранные столбцы в единый выходной набор данных. Стандарты SQL поддерживают два варианта синтаксиса соединения: неявное и явное соединение. Неявное соединение соответствует более старому SQL-стандарту (SQL:89). Таблицы, участвующие в соединении, задаются списком с разделяющими запятыми в предложении FROM запроса SELECT. Условия для связи таблиц задаются среди условий поиска предложения WHERE. Не существует специального синтаксиса для указания, какие условия используются для поиска, а какие - для соединения. В стандарте SQL:92 введен более универсальный синтаксис явного соединения, которое осуществляется с помощью предложения JOIN. Структура предложения JOINON дает возможность отличать условие соединения от условий поиска. Следует отметить, что неявное соединение может быть всегда заменено эквивалентным явным, обратное же возможно не всегда. Различные виды явных и неявных соединений будут рассмотрены далее. Подзапросом является запрос, заключенный в круглые скобки и вложенный в предложение SELECT, FROM, WHERE или HAVING основного (внешнего) запроса SELECT или других запросов, использующих эти предложения. Правила построения подзапросов изменяются в соответствии с целью запроса. Соединения и подзапросы используют слияние потоков данных из строк различных таблиц, поэтому их роли частично совпадают при некоторых условиях. Запросы объединения, реализуемые с помощью предложения UNION, дают возможность выбрать строки из различных наборов данных в объединенный набор данных, причем подмножества не обязательно должны быть связаны друг с другом - просто они должны соответствовать друг другу структурно. Соединения, подзапросы и объединения не являются взаимоисключающими. Соединения и объединения могут включать подзапросы, и некоторые подзапросы могут содержать соединения. Далее будут рассмотрены все виды запросов к множеству таблиц более подробно. 3.3.1. Соединения таблиц 3.3.1.1. Неявное соединение таблиц Как уже отмечалось, соединения используются для получения составных наборов данных, содержащих столбцы из нескольких таблиц, которые хранят связанные данные. Формат предложений FROM и WHERE при неявном соединении таблиц имеет следующий вид: FROM <таблица1> [псевдоним1], <таблица2> [псевдоним2 WHERE <условие соединения> [AND <условие поиска>] ], где <условие соединения>::= <таблица1>.столбец <операция сравнения> <таблица2>.столбец, <операция сравнения> {= < > <= >= <> }. Таким образом, особенности синтаксиса неявных соединений следующие: - использование более одной таблицы в предложении FROM (список таблиц с разделяющими запятыми); - среди остальных условий поиска предложения WHERE применяется операция сравнения для создания выражения, которое определяет столбцы, используемые для соединения указанных таблиц (<условие соединения>). При этом соединение на основе точного равенства между двумя столбцами называется соединением по равенству. Алгоритм выполнения запросов на неявное соединение таблиц состоит из следующих этапов [24]:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |