Union ALL. Selectchild. Part, CHILD. Subpart, CHILD. Quantity

SELECT CHILD.Part, CHILD.Subpart, CHILD.Quantity

FROM RPL PARENT, PARTLIST CHILD

WHERE PARENT.Subpart = CHILD.Part

)

SELECT DISTINCT Part, Subpart, Quantity

FROM RPL

ORDER BY Part, Subpart, Quantity;

Приведенный запрос включает общее табличное выражение, названное RPL (Recursive PARTLIST), которое определяет рекурсивную часть запроса. Оно иллюстрирует основные элементы рекурсивного общего табличного выражения. Первый операнд (запрос) операции UNION, определяемый как инициализирующий запрос, позволяет получить компоненты, подчиненные непосредственно компоненту с номером ’01’. В конструкции FROM этого запроса используется исходная таблица и никогда не используется это же табличное выражение (RPLв данном примере). Результат первого запроса записывается в таблицу общего табличного выражения RPL, и RPL будет иметь следующий вид:

Номер строки Part Subpart Quantity
       
       
       
       

Как и в данном примере, всегда должна использоваться операция UNION ALL. Второй операнд (запрос) операции UNION использует RPLдля вычисления подкомпонентов для подкомпонентов, указывая в конструкции FROM соединение таблицы общего табличного выражения RPL(PARENT) по атрибуту Subpart и исходной таблицы (CHILD) по атрибуту Part. Результат также записывается в RPL. По мере появления новых строк в RPL они будут использоваться в запросе, определенном во втором операнде UNION.

После первой итерации в табличное выражение RPL будут добавлены строки с 5-й по 11-ю, и просмотр табличного выражения RPL закончится на 4-й строке:

Номер строки Part Subpart Quantity
       
       
       
       
       
       
       
       
       
       
       

На второй итерации обработка RPL продолжится с 5-й строки; в результате в RPL будут добавлены строки с 12-й по 17-ю, и просмотр табличного выражения RPL закончится на 11-й строке:

Номер строки Part Subpart Quantity
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

На следующей итерации обработка RPL продолжится с 12-й строки. В строках с 12-й по 17-ю в колонке Subpart RPL указаны значения, которые отсутствуют в колонке Part основной таблицы, поэтому новые строки в RPL не заносятся; когда все строки RPL будут просмотрены (обработаны), выполнение запроса завершится.

В полученном результате можно заметить, что, например, строка <06, 12, 10> появилась дважды: один раз в результате обработки связи 01 – 06, 06 – 12, второй раз – в результате обработки связи 01 – 02, 02 – 06, 06 – 12. Фраза SELECT DISTINCT в основном запросе гарантирует, что одни и те же значения Part/Subpart не будут выведены более одного раза.

В результате выполнения приведенного запроса будут получены следующие данные:

Part Subpart Quantity
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

Пример 2. Написать запрос, позволяющий получить общее количество каждого компонента, входящего в состав некоторого заданного компонента, например, компонента с номером ’01’.

Главное отличие от примера 1 заключается в том, что здесь необходимо использовать агрегатную функцию для суммирования количества компонентов. Так, например, компонент ’02’ включает 6 экземпляров компонента ’06’. Если компонент ’01’ включает 2 экземпляра компонента ’02’, значит, для построения компонента ’01’, в общем случае, потребуется 2*6 = 12 экземпляров компонента ’06’.

WITH RPL (Part, Subpart, Quantity) AS

(

SELECT ROOT.Part, ROOT.Subpart, ROOT.Quantity

FROM PARTLIST ROOT

WHERE ROOT.Part = '01'


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: