MS SQL递归获取带有父ID的子ID

问题描述 投票:0回答:1

我已经创建了搜索SQL查询,我快要完成了,我只需要将WHERE子句与ID匹配,并将其作为父ID。目前,我只匹配一个ID,而不是父母。我不确定该如何解决。

这是我的查询,我需要更改的代码是注释“该部分需要匹配tileid及其父tileid”。基于[TileId],我需要获取[TileId]及其父母。

WITH [TileSearch_CTE] ([TileId], [TypeId], [TypeName], [Title], [Info]) AS 
( 
	SELECT TOP 10 [TileId], [TypeId], [TypeName], [Title], [Info] 
	FROM [Priox].[TileFullTextSearchNL] 
	INNER JOIN CONTAINSTABLE([Priox].[TileFullTextSearchNL], *, '"searchText*"') AS [CT] 
	ON [Priox].[TileFullTextSearchNL].[TileId] = [CT].[Key] 
	WHERE 
	(
		NOT EXISTS 
		(
			SELECT [intPortalTileFilterId] 
			FROM [Priox].[tblPortalTileFilter] 
			WHERE [intPortalTileIdFk] = [TileId] -- This part needs to match the tileid and it's parent tileids
		) 
		OR EXISTS 
		(
			SELECT [intPortalTileFilterId] 
			FROM [Priox].[tblPortalTileFilter] 
			WHERE [intPortalTileIdFk] = [TileId] -- This part needs to match the tileid and it's parent tileids
			AND [intPortalFilterIdFk] IN (56) 
		)
	) 
	ORDER BY [CT].[Rank] DESC 
) 
SELECT [TileId], [TypeName], [Title], [Info], [TP].[strName] AS [ParamName], [TPV].[strParamValue] AS [ParamValue] 
FROM [TileSearch_CTE] 
LEFT JOIN [Priox].[tblPortalTileParam] AS [TP] ON [TP].[intTileType] = [TileSearch_CTE].[TypeId] 
LEFT JOIN [Priox].[tblPortalTileParamValue] AS [TPV] ON [TPV].[intTileParamIdFk] = [TP].[intPortalTileParamId] AND [TileSearch_CTE].[TileId] = [TPV].[intTileIdFk]

这是切片的数据库结构。

enter image description here

因此查询应执行以下操作。

SELECT [intPortalTileFilterId] 
FROM [Priox].[tblPortalTileFilter] 
WHERE [intPortalTileIdFk] IN (438,1317)

我自己修复了它,创建了一个返回父母和孩子的函数。

CREATE FUNCTION [Priox].[GetTileIdHierarchy]
(
    @tileId int    
)
RETURNS TABLE
AS
RETURN  
(
	WITH parents AS
    (
		SELECT [intPortalTileId], [intPortalTileId] AS [intParentIdFk]
		FROM [Priox].[tblPortalTile] WHERE [intPortalTileId] = @tileId
	    UNION ALL
	    SELECT p.[intPortalTileId], [Priox].[tblPortalTile].[intParentIdFk] 
		FROM parents p
		INNER JOIN [Priox].[tblPortalTile] on p.[intParentIdFk] = [Priox].[tblPortalTile].[intPortalTileId]
        AND [Priox].[tblPortalTile].[intParentIdFk] IS NOT NULL
		AND [Priox].[tblPortalTile].[intPortalTileId] <> [Priox].[tblPortalTile].[intParentIdFk]
	)  
	SELECT [intPortalTileId], [intParentIdFk]
    FROM parents
	WHERE [intPortalTileId] = @tileId 
)
GO

并相应地更改了我的搜索查询。

WITH [TileSearch_CTE] ([TileId], [TypeId], [TypeName], [Title], [Info], [Rank]) AS 
( 
	SELECT TOP 10 [TileId], [TypeId], [TypeName], [Title], [Info],[CT].[Rank] AS [Rank]
	FROM [Priox].[TileFullTextSearchNL] 
	INNER JOIN CONTAINSTABLE([Priox].[TileFullTextSearchNL], *, '"searchTerm*"') AS [CT]
	ON [Priox].[TileFullTextSearchNL].[TileId] = [CT].[Key] 
	WHERE 
	(
		NOT EXISTS 
		(
			SELECT [intPortalTileFilterId] 
			FROM [Priox].[tblPortalTileFilter] 			
			WHERE [intPortalTileIdFk] IN  
			(
				SELECT [intParentIdFk] FROM [Priox].[GetTileIdHierarchy] ([TileId])
			)			
		) 
		OR 
		EXISTS 
		(
			SELECT [intPortalTileFilterId] 
			FROM [Priox].[tblPortalTileFilter] 			
			WHERE [intPortalTileIdFk] IN  
			(
				SELECT [intParentIdFk] FROM [Priox].[GetTileIdHierarchy] ([TileId])				
			)						
			AND [intPortalFilterIdFk] IN (51) 			
		)
	) 
	ORDER BY [CT].[Rank] DESC 
) 
SELECT [TileId], [TypeName], [Title], [Info], [TP].[strName] AS [ParamName], [TPV].[strParamValue] AS [ParamValue] , [Rank]
FROM [TileSearch_CTE] 
LEFT JOIN [Priox].[tblPortalTileParam] AS [TP] ON [TP].[intTileType] = [TileSearch_CTE].[TypeId] 
LEFT JOIN [Priox].[tblPortalTileParamValue] AS [TPV] ON [TPV].[intTileParamIdFk] = [TP].[intPortalTileParamId] AND [TileSearch_CTE].[TileId] = [TPV].[intTileIdFk]
sql full-text-search common-table-expression recursive-query
1个回答
0
投票

我用解决方案编辑了起始帖子。

© www.soinside.com 2019 - 2024. All rights reserved.