В запросе CTE подсчитать записи в другой таблице на основе идентификатора первой таблицы - PullRequest
1 голос
/ 29 апреля 2019

Я работаю над запросом на основе CTE. Я никогда не использовал это раньше. Я использую следующий запрос, который получает записи из таблицы user_detail.

 with cte as ( select  cust_ID, parentid, name, joinside,regdate,package,null lnode, null rnode from  user_detail 
 where cust_ID = @nodeid 
 union all select t.cust_ID, t.parentid,t.name, t.joinside,t.regdate,t.package, 
 ISNULL(cte.lnode, CASE WHEN t.joinside = 0 THEN 1 ELSE 0 END) lnode, 
 ISNULL(cte.rnode, CASE WHEN t.joinside = 1 THEN 1 ELSE 0 END) rnode from  user_detail 
 t inner join cte on cte.cust_ID = t.parentid )

 select @nodeid nodeid,name,cust_ID,parentid,regdate,package from cte 

 where rnode='0' order by cust_id asc option (maxrecursion 0)

Вышеупомянутый запрос дает мне 6 столбцов (nodeid, name, cust_ID, parentid, regdate, package). Теперь, что я на самом деле хочу, я хочу 7-й столбец, который будет считать строки на основе cust_id из других частей таблицы.

Я делаю, как показано ниже, но когда я добавляю группу в запросе, это дает мне ошибку ..

 declare @nodeid int = '1';
 with cte as ( select  cust_ID, parentid, name, joinside,regdate,package,null lnode, null rnode from  user_detail 
 where cust_ID = @nodeid 
 union all select t.cust_ID, t.parentid,t.name, t.joinside,t.regdate,t.package, 
 ISNULL(cte.lnode, CASE WHEN t.joinside = 0 THEN 1 ELSE 0 END) lnode, 
 ISNULL(cte.rnode, CASE WHEN t.joinside = 1 THEN 1 ELSE 0 END) rnode from  user_detail 
 t inner join cte on cte.cust_ID = t.parentid )

 select @nodeid nodeid,name,ctttt.cust_ID,parentid,regdate,package,insttt.cust_id from cte as ctttt left join installments as insttt 
 on ctttt.cust_id = insttt.cust_id

 where rnode='0' order by ctttt.cust_id asc option (maxrecursion 0)

1 Ответ

0 голосов
/ 29 апреля 2019

Использование sub query

 (select count(*) from installments as insttt  where  ctttt.cust_id = insttt.cust_id ) cnt

Запрос:

declare @nodeid int = '1';
 with cte as ( select  cust_ID, parentid, name, joinside,regdate,package,null lnode, null rnode
               from  user_detail 
               where cust_ID = @nodeid 
               union all 
               select t.cust_ID, t.parentid,t.name, t.joinside,t.regdate,t.package, 
               ISNULL(cte.lnode, CASE WHEN t.joinside = 0 THEN 1 ELSE 0 END) lnode, 
               ISNULL(cte.rnode, CASE WHEN t.joinside = 1 THEN 1 ELSE 0 END) rnode 
               from  user_detail t 
               inner join cte on cte.cust_ID = t.parentid )

 select @nodeid nodeid,name,ctttt.cust_ID,parentid,regdate,package,insttt.cust_id , 
        (select count(*) from installments as insttt  where  ctttt.cust_id = insttt.cust_id ) cnt
 from cte as ctttt 
 where rnode='0'
 order by ctttt.cust_id asc option (maxrecursion 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...