I have following table:
x
ID NAME PARENT_ID ISDELETED ISINEDIT
1 JJ NULL 1 0
2 AR 1 0 0
3 PR 2 0 0
4 DR NULL 0 1
What I need to get is SELECT query that will return only rows that have ISDELETED 0 and ISINEDIT 0 and whose parents or grandparents are 0 as well
I currently have:
;WITH ChildParent AS
(
SELECT
a.id,
a.name,
a.isinedit,
a.parent_id,
a.isdeleted
FROM dbo.table
WHERE isdeleted = 0 AND isinedit = 0
UNION ALL
SELECT
a.id,
a.name,
a.isinedit,
a.parent_id,
a.isdeleted
FROM dbo.table a
INNER JOIN ChildParent cp ON a.parent_id = cp.id
WHERE a.isdeleted = 0 AND a.isinedit = 0
)
SELECT
id,
name,
parent_id,
isinedit,
isdeleted
FROM ChildParent
But for some reason it returns double rows
Advertisement
Answer
You need to add the same isdeleted = 0 AND isinedit = 0
predicate to the INNER JOIN childParent CP
source.
…but if you do that you make your CTE query very fiddly and if you have to repeat the same thing over-and-over there’s probably a better way to do it.
…and there is! A SELECT
query can have multiple CTE expressions:
;
WITH filtered AS
(
SELECT
a.id,
a.name,
a.parent_id,
FROM
dbo.Table
WHERE
IsDeleted = 0
AND
IsInEdit = 0
)
WITH cte AS
(
SELECT
a.id,
a.name,
a.parent_id
FROM
filtered
UNION ALL
SELECT
a.id,
a.name,
a.parent_id
FROM
filtered
INNER JOIN cte ON a.parent_id = cte.id
)
SELECT
*
FROM
cte
ORDER BY
id