Программирование >>  Построение запросов sql 

1 ... 39 40 41 [ 42 ] 43 44 45 ... 101


В качестве табличного подзапроса может использоваться любой запрос SELECT, причем при использовании рекурсии <табличный подзапрос> обязательно содержит в себе объединение результатов нескольких запросов.

Рассмотрим пример использования нерекурсивной производной таблицы, определенной в предложении WITH. Допустим, необходимо вывести по каждому абоненту номер его лицевого счета, ФИО и общие суммы оплат за 2000 и 2001 годы. Запрос будет выглядеть следующим образом: WITH Year Abon Pay AS (SELECT PayYear, AccountCD, SUM(PaySum) AS Total Sum FROM PaySumma GROUP BY PayYear, AccountCD) SELECT A.AccountCD, A.Fio,

God 2000. Total Sum AS Total 2000, God 2001. Total Sum AS Total 2001

FROM Abonent A

LEFT JOIN Year Abon Pay God 2000 ON A.AccountCD = God 2000.AccountCD

AND God 2000. PayYear = 2000

LEFT JOIN Year Abon Pay God 2001 ON A.AccountCD = God 2001.AccountCD AND God 2001. PayYear = 2001;.

Результат выполнения запроса представлен на рис. 3.78.

ACCOUNTCD

TOTAL 2000

TOTAL 2001

005488

АКСЕНОВ С.А.

108,13

58,70

115705

МИЩЕНКО Е.В.

290,00

346,50

015527

КОНЮХОВ В.С.

<null>

<null>

443690

ТУЛУПОВА М.И.

<null>

<null>

136159

СВИРИНА З.А.

<null>

<null>

443069

СТАРОДУБЦЕВ Е.В.

<null>

156,82

136160

ШМАКОВ С.В.

18,30

20,00

126112

МАРКОВА В.П.

15,30

25,30

136169

ДЕНИСОВА Е.К.

<null>

107,02

080613

ЛУКАТИНА РМ

35,46

56,00

080047

ШУБИНА Т.П.

<null>

112,56

080270

ТИМОШКИНА Н.Г.

58,10

106,10

Рис. 3.78. Результат выполнения запроса с нерекурсивной производной

таблицей

использования нерекурсивных

предложении WITH, могут

Следует отметить следующие особенности подзапросов в предложении WITH:

- производные таблицы, определенные в ссылаться друг на друга;

- ссылка на производную таблицу (имя производной таблицы) может использоваться в любой части основного запроса (в предложениях SELECT, FROM и т.д.);



- одна и та же производная таблица может использоваться несколько раз в основном запросе под разными псевдонимами;

- в многострочных запросах на обновление (INSERT, UPDATE и DELETE) подзапросы могут включать предложение WITH, определяющее производные таблицы;

- производные таблицы могут использоваться в процедурном языке. Рекурсивные производные таблицы в предложении WITH позволяют

создавать рекурсивные запросы.

Рассмотрим пример использования рекурсивной производной таблицы, определенной в предложении WITH. Предположим, что в таблицу Abonent был добавлен еще один столбец HEADACCOUNT (это можно сделать с помощью запроса ALTER TABLE, использование которого будет рассмотрено позднее). В этом столбце для каждого абонента указан лицевой счет управляющего по дому, в котором проживает абонент. Если абонент сам является управляющим, то в столбце HEADACCOUNT указывается NULL. Допустим, в таблице Abonent имеются данные, представленные на рис. 3.79.

ACCOUNTCD

HEAD ACCOUNT

STREETCD

HOUSENO

FLATNO

PHONE

005488

<null>

АКСЕНОВ С.А.

556893

015527

115705

КОНЮХОВ В.С.

761699

080047

<null>

ШУБИНА Т.П.

257842

080270

<null>

ТИМОШКИНА Н.Г.

321002

080613

<null>

ЛУКАШИНА Р.М.

254417

115705

<null>

МИЩЕНКО Е.В.

769975

126112

136169

МАРКОВА В.П.

683301

136159

<null>

СВИРИНА З.А.

350003

136160

<null>

ШМАКОВ С.В.

982222

136169

<null>

ДЕНИСОВА Е.К.

680305

443069

<null>

СТАРОДУБЦЕВ Е.В.

683014

443690

<null>

ТУЛУПОВА М.И.

214833

Рис. 3.79. Данные таблицы Abonent с дополнительным столбцом

Допустим, необходимо вывести ту же информацию, что и в предыдущем примере, но вывод представить в виде дерева: перед ФИО каждого управляющего по дому поставить +, а ниже вывести всех абонентов, проживающих в данном доме, с указанием перед их ФИО 4 символов пробела. Запрос будет выглядеть следующим образом:

WITH RECURSIVE

Year Abon Pay AS

(SELECT PayYear, AccountCD, SUM(PaySum) AS Total Sum FROM PaySumma GROUP BY PayYear, AccountCD), Abonent Tree AS

(SELECT AccountCD, Head AccountCD, Fio,

CAST (+ AS VARCHAR(4)) AS Indent

FROM Abonent

WHERE Head AccountCD IS NULL



UNION ALL

SELECT A.AccountCD, A.Head AccountCD, A.Fio,

CAST ( AS VARCHAR(4)) AS Indent FROM Abonent A JOIN Abonent Tree Tr

ON A. Head AccountCD = Tr.AccountCD) SELECT A.AccountCD, A. Indent A.Fio AS Fio,

God 2000. Total Sum AS Total 2000, God 2001. Total Sum AS Total 2001 FROM Abonent Tree A

LEFT JOIN Year Abon Pay God 2000

ON A.AccountCD = God 2000.AccountCD AND God 2000. PayYear = 2000

LEFT JOIN Year Abon Pay God 2001 ON A.AccountCD = God 2001.AccountCD

AND God 2001. PayYear = 2001;.

Результат выполнения запроса представлен на рис. 3.80.

ACCOUNTCD

TOTAL 2000

TOTAL 2001

005488

+АКСЕНОВ С.А.

108,13

58,70

115705

+МИЩЕНКО Е.В.

290,00

346,50

015527

КОНЮХОВ В.С.

<null>

<null>

443690

+ТУЛУПОВА М.И.

<null>

<null>

136159

+СВИРИНА З.А.

<null>

<null>

443069

+СТАРОДУБЦЕВ Е.В.

<null>

156,82

136160

+ШМАКОВ С.В.

18,30

20,00

136169

+ДЕНИСОВА Е.К.

<null>

107,02

126112

МАРКОВА В.П.

15,30

25,30

080613

+ЛУКАТИНА РМ

35,46

56,00

080047

+ШУБИНА Т.П.

<null>

112,56

080270

+ТИМОШКИНА Н.Г.

58,10

106,10

Рис. 3.80. Результат выполнения запроса с рекурсией

Необходимо указать следующие особенности использования рекурсивных производных таблиц:

- рекурсивная производная таблица имеет ссылку на саму себя;

- рекурсивная производная таблица - это объединение в одном запросе (UNION) рекурсивных и нерекурсивных частей;

- должна присутствовать, по крайней мере, одна нерекурсивная часть;

- нерекурсивные части располагаются в начале запроса, содержащего объединение;

- рекурсивные части отделяются от нерекурсивных и от самих себя с помощью конструкции UNION ALL;

- использование предложений DISTINCT,GROUP BY, HAVING, а также

использование агрегатных функций не допускается в рекурсивных частях запроса;



1 ... 39 40 41 [ 42 ] 43 44 45 ... 101

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика