我发现这个SQL函数遍历表并且它找到 ParentID 代码工作,除非我在其中放置where子句时对新创建的列不起作用。如果我不使用where子句,它会生成 Expr1 作为树的根,这就是我想要的但是我不能在它上面添加条件。
有人可以帮我解决这个问题吗?
ALTER FUNCTION dbo.fn_Root
(
@PostID int
)
RETURNS int
AS
BEGIN
DECLARE @R int
SELECT @R = CASE WHEN ParentPostID = 0 THEN PostID
ELSE dbo.fn_Root(ParentPostID)
END
FROM Post
WHERE PostID = @PostID
RETURN @R
END
SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post WHERE Expr1 = 5
答案 0 :(得分:3)
您无法直接在SQL Server的WHERE
子句中引用计算/计算列别名。但是,一个简单的解决方法是包装语句并将WHERE
子句置于外部,引用计算列:
SELECT * FROM (
SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post)
WHERE Expr1 = 5
答案 1 :(得分:2)
另一种可能的解决方法:您可以将计算值再次放入WHERE
子句中:
SELECT PostID, Title, dbo.fn_Root(PostID) AS Expr1
FROM Post
WHERE dbo.fn_Root(PostID) = 5