首页 > 解决方案 > 从查询中删除联合

问题描述

我有查询以获取同一类别的类别和子类别。我使用了以下查询:

    Select Id from category where name like '%events%' and deleted = 0 and published = 1
UNION
SELECT Id from category where parentcategoryid = (Select id from category where name like '%events%' and deleted = 0 and published = 1)

我不想使用 UNION,只想使用 Join。但没有得到我如何实现。下面是表结构。请帮我。提前致谢

类别表

标签: sqlsql-serverjoinunion

解决方案


以下可能会解决您的问题:

DECLARE @t TABLE (id int, name varchar(20), parentcatid varchar(200))
insert into @t values(23,'Christmas', 34)
                        ,(29,'Birthday', 34)
                        ,(31,'New year', 34)
                        ,(34,'Events', 0)
                        ,(35,'gfrhrt', 0)
                        
;WITH cte AS(
  Select Id from @t
  where name like '%events%' --and deleted = 0 and published = 1
),
cte2 AS (
SELECT a.id AS tId, cpa.id, cId2.id AS idPa
  from @t a
  LEFT JOIN cte AS cId ON cId.Id = a.Id
  FULL OUTER JOIN @t AS cPa ON cPa.parentcatid = cId.Id
  LEFT JOIN cte cId2 ON cId2.id = cPa.id
  WHERE cId.Id IS NOT NULL OR cPa.Id IS NOT NULL
)
SELECT id
  FROM cte2
  WHERE tId IS NOT NULL
    OR id = idPa  

这个想法是在 cte 中获取所有必需的 ID,然后获取所有类别,其中任一 ID 或 ParentID 与来自 cte 的 ID 匹配。但是,根据表的大小,您可能希望向 cte 添加更多过滤器。


推荐阅读