Рекурсивный оператор SQL без временной таблицы - PullRequest
0 голосов
/ 05 августа 2020

У меня есть рабочий рекурсивный SQL оператор. Из-за некоторых ограничений в моей системе мне нужно переформулировать его так, чтобы он начинался с «select count». все ветки под этой точкой.

Это будет fantasti c, если у вас есть идея.

Вот мое утверждение:

WITH temp_Parent_ID (Parent_productgroup_id, Productgroup_id) AS    
(
    SELECT 
        Parent_productgroup_id, Productgroup_id 
    FROM 
        VW_PRODUCTGROUP_HIERARCHY 
    WHERE 
        Productgroup_id = 26976

    UNION ALL 

    SELECT 
        VW.Parent_productgroup_id, VW.Productgroup_id
    FROM 
        VW_PRODUCTGROUP_HIERARCHY VW    
    INNER JOIN 
        temp_Parent_ID temp ON VW.Parent_productgroup_id = temp.Productgroup_id
)
SELECT 
    COUNT(ae.element_ID) 
FROM 
    temp_Parent_ID temp 
INNER JOIN 
    VW_PRODUCTS_HIERARCHY VW ON temp.Productgroup_id = VW.PRODUCTGROUP_ID
INNER JOIN
    VW_PRODUCTS_ASSIGNED_E ae ON VW.PRODUCTVARIANT_ID = ae.PRODUCT_ID
INNER JOIN 
    VW_CATEGORY_ELEMENTS ce ON ae.ELEMENT_ID = ce.ELEMENT_ID
WHERE
    ce.CATEGORY_MASTER_NAME LIKE 'Technische Zeichnung (DWG)'
    AND ce.CATEGORY_LANGUAGE LIKE 'da'

1 Ответ

0 голосов
/ 05 августа 2020

Вам нужно предложение WITH, потому что вам нужен рекурсивный запрос. Предложение WITH нельзя переместить в другое место в запросе на сервере SQL. Это ограничение указывает c на SQL Сервер, поэтому это, например, невозможно:

select *
from ( with x as (select 1 as col) select * from x ) t;

Предложение WITH является произвольным c представлением. Следовательно, единственный вариант, который я вижу для SQL Server, - это сделать это обычным представлением:

CREATE VIEW view_products AS
WITH temp_Parent_ID (Parent_productgroup_id, Productgroup_id) AS    
(
    SELECT 
        Parent_productgroup_id, Productgroup_id 
    FROM 
        VW_PRODUCTGROUP_HIERARCHY 
    WHERE 
        Productgroup_id = 26976

    UNION ALL 

    SELECT 
        VW.Parent_productgroup_id, VW.Productgroup_id
    FROM 
        VW_PRODUCTGROUP_HIERARCHY VW    
    INNER JOIN 
        temp_Parent_ID temp ON VW.Parent_productgroup_id = temp.Productgroup_id
)
select * from temp_Parent_ID;

А затем использовать это представление в вашем запросе:

SELECT 
    COUNT(ae.element_ID) 
FROM 
    view_products
INNER JOIN 
    VW_PRODUCTS_HIERARCHY VW ON view_products.Productgroup_id = VW.PRODUCTGROUP_ID
INNER JOIN
    VW_PRODUCTS_ASSIGNED_E ae ON VW.PRODUCTVARIANT_ID = ae.PRODUCT_ID
INNER JOIN 
    VW_CATEGORY_ELEMENTS ce ON ae.ELEMENT_ID = ce.ELEMENT_ID
WHERE
    ce.CATEGORY_MASTER_NAME LIKE 'Technische Zeichnung (DWG)'
    AND ce.CATEGORY_LANGUAGE LIKE 'da'
...