Родительская строка отсутствует в дочерних родительских отношениях в CTE - PullRequest
1 голос
/ 07 февраля 2012

У меня есть временная таблица, в которой у меня есть следующие данные, я хочу отфильтровать строки потомка с его родителем categoryID, пока его границы не достигнут в верхней части этого Родителя в этой иерархии.

Parent missing in Parent Child relationship

;with cte (rowid,ParentCategoryID,CategoryID,Status,Level,CategoryName,ISProduct) as
(
     Select  rowid,ParentCategoryID,CategoryID,Status,Level,CategoryName,ISProduct from #newtemp      where ParentCategoryId!=0

     union all
     select cte.rowid,cte.ParentCategoryID,cte.CategoryID,cte.Status,cte.Level,cte.CategoryName,cte.ISProduct
     from  #newtemp inner join cte ON cte.CategoryId=#newtemp.ParentCategoryId
)
select * from cte

Ответы [ 2 ]

1 голос
/ 10 декабря 2012

Вам необходимо заменить cte.CategoryId = # newtemp.ParentCategoryId на c.ParentCategoryId = # newtemp.CategoryID

;with cte (rowid,ParentCategoryID,CategoryID,Status,Level,CategoryName,ISProduct) as
 (
  Select  rowid, ParentCategoryID, CategoryID, Status, Level, CategoryName, ISProduct 
  from #newtemp  
  where ParentCategoryId!=0
  union all
  select t.rowid, t.ParentCategoryID, t.CategoryID, t.Status, t.Level, t.CategoryName, t.ISProduct
  from  #newtemp t inner join cte c ON c.ParentCategoryId = t.CategoryID
  )
  select * from cte

Демонстрация на SQLFiddle

0 голосов
/ 07 февраля 2012

Если я правильно вас понял.Вы что-то вроде этого:

Сначала некоторые тестовые данные:

DECLARE @tbl TABLE
            (
                rowid INT,
                parentCategoryID INT,
                CategoryID INT,
                [Status] INT,
                [Level] INT, 
                CategoryName VARCHAR(100),
                ISProduct BIT
            )

INSERT INTO @tbl
SELECT 1,0,1,1,0,'jewellary',1 UNION ALL
SELECT 2,0,2,1,0,'f',0 UNION ALL
SELECT 11,2,4,1,10,'ghdf',1

Затем CTE вот так:

;WITH cte_name (rowid,CategoryID,parentCategoryID,HasChildren)
AS
(
SELECT
    tbl.rowid,
    tbl.CategoryID,
    tbl.parentCategoryID,
    CASE WHEN EXISTS 
            (
                SELECT
                    NULL
                FROM
                    @tbl AS tblInner
                WHERE
                    tblInner.parentCategoryID=tbl.CategoryID
            )
        THEN 1
        ELSE 0
    END
    AS HasChildren
FROM
    @tbl AS tbl
WHERE
    tbl.parentCategoryID=0
UNION ALL
SELECT
    tbl.rowid,
    tbl.CategoryID,
    tbl.parentCategoryID,
    cte.HasChildren
FROM
    @tbl AS tbl
    JOIN cte_name AS cte
        on cte.CategoryID=tbl.parentCategoryID
)

SELECT 
    tbl.*
FROM 
    cte_name
    JOIN @tbl AS tbl
        ON cte_name.rowid=tbl.rowid
WHERE
    cte_name.HasChildren=1
...