2015-04-13 6 views
0

таблица счетаSQL-запрос, чтобы получить группы и суб группы иерархии

ac_id  ac_name  st_id 
----------- ------------- ----------- 
1   LIABILITES  1 
2   ASSET   1 
3   REVENUE  1 
4   EXPENSES  1 
5   EQUITY   1 

Группы стол

grp_id  grp_name   ac_no  grp_of  st_id type_  cmp_id 
----------- ------------------- ---------- -------- --------- --------- -------- 
1   Capital Account  1   0  1   0   0 
2   Current Liability 1   0  1   0   0 
3   Loan Liability  1   0  1   0   0 
4   Suspense A/C  1   0  1   0   0 
5   Current Assets  2   0  1   0   0 
6   Fixed Assests  2   0  1   0   0 
7   Investment   2   0  1   0   0 
8   Misc. Expenses  2   0  1   0   0 
9   Direct Income  3   0  1   0   0 
10   Indirect Income  3   0  1   0   0 
11   Sale Account  3   0  1   0   0 
12   Direct Expense  4   0  1   0   0 
13   Indirect Expense 4   0  1   0   0 
14   Purchase Account 4   0  1   0   0 
15   Sundry Creditors 2   1  1   0   0 
16   Sundry Debitors  5   1  1   0   0 
17   Bank Account  5   1  1   0   0 
18   Cash In Hand  5   1  1   0   0 
19   Duties & Taxes  2   1  1   0   0 
20   Salary    12   1  1   0   0 
21   Personal   5   1  1   0   0 
22   Loan    2   0  1   0   0 
23   Customer   16   1  1   0   0 
34   Vendor    15   1  1   0   0 
38   Sale Softwares  11   1  1   1   1 
46   Stock In Hand  5   1  1   1   1 
47   test    1   1  1   1   1 
48   test in    47   1  1   1   1 

запрос, чтобы получить все группы иерархии.

declare @ac_no as int =2 

;With CTE(grp_id,grp_name,ac_no,Level) 
AS 
( SELECT 
     grp_id,grp_name,ac_no,CAST(1 AS int) 
    FROM 
     Groups 
    WHERE 
     grp_id in (select grp_id from Groups where ([email protected]_no) and grp_of=0) 
    UNION ALL 
    SELECT 
     o.grp_id,o.grp_name,o.ac_no,c.Level+1 
    FROM 
     Groups o 
    INNER JOIN 
     CTE c 
     ON c.grp_id=o.ac_no --where o.ac_no=2 and o.grp_of=1 
) 
select * from CTE 

Результат хорошо для ac_no=2/3/4

grp_id  grp_name   ac_no  Level 
----------- ------------------- ----------- ------ 
5   Current Assets  2   1 
6   Fixed Assests  2   1 
7   Investment   2   1 
8   Misc. Expenses  2   1 
22   Loan    2   1 
16   Sundry Debitors  5   2 
17   Bank Account  5   2 
18   Cash In Hand  5   2 
21   Personal   5   2 
46   Stock In Hand  5   2 
23   Customer   16   3 

Но когда я пытаюсь получить результат для ac_no=1; я получаю сообщение об ошибке:

Msg 530, Level 16, State 1, Line 4 Заявление завершается. Максимальная рекурсия 100 была исчерпана до завершения заявки.

+0

Я думаю, что [этот ответ] (http://stackoverflow.com/a/19221963/4519059) является полезно;). –

ответ

0

Я думаю, проблема заключается в том, что вы закончите бесконечную рекурсию, поскольку у вас есть строка, которая является ее собственным родителем/дочерним элементом (например, grp_id = ac_no).

Я думаю, что он должен работать, если вы добавите предельное условие для рекурсивного элемента, как это:

DECLARE @ac_no AS int = 1; 

WITH CTE (grp_id , grp_name , ac_no , Level) AS ( 

    SELECT grp_id, grp_name, ac_no, CAST(1 AS int) 
    FROM Groups 
    WHERE grp_id IN (SELECT grp_id FROM Groups WHERE ac_no = @ac_no AND grp_of = 0) 

    UNION ALL 

    SELECT o.grp_id, o.grp_name, o.ac_no, c.Level + 1 
    FROM Groups o 
    INNER JOIN CTE c ON c.grp_id = o.ac_no --where o.ac_no=2 and o.grp_of=1 
    WHERE c.ac_no <> c.grp_id 
    ) 

SELECT * FROM CTE; 
+0

да, это правильно ......., спасибо ....... – Rajendra

Смежные вопросы