【发布时间】:2016-05-11 13:38:28
【问题描述】:
我的查询使用 'exists' 函数作为过滤器,其中包含标量值函数。标量值函数包含 cte 和“(select top 1 1)”。当我使用存在时,它根本不会过滤。相反,当我使用“where 1 =(svf)”时,它似乎有效。我在存在查询中错过了什么或任何错误吗?
SELECT * FROM TBL1
WHERE EXISTS (SELECT SVF(1,2))
--where SVF is my scalar valued from which returns bit and looks like as shown below.
CREATE FUNCTION SVF
(
@x int,
@y int
)
RETURNS bit
AS
BEGIN
declare @result bit
;WITH T1
AS (
SELECT * from tbl2
)
SELECT @result= (select top 1 1
FROM t1
)
return isnull(@result,0)
END
GO
--the following query works
SELECT * FROM TBL1
WHERE 1=(SELECT SVF(1,2))
【问题讨论】:
-
这个标量函数的意义何在?它似乎过于复杂。为什么不放弃这个标量函数而简单地使用“where exists (select * from tbl2)”呢?标量函数效率极低,在这种情况下似乎完全没有必要。
-
另外,阅读
EXISTS:“如果子查询包含任何行,则返回 TRUE。”并注意它没有说明行的 contents 。您有一个子查询(因为它缺少FROM子句)总是只生成一行。它总是能轻松满足EXISTS测试。 -
看这个有点接近整个功能是完全没有意义的。它总是会返回一个值,因此存在检查总是会成功。
-
不能删除标量函数。它里面有很多脚本。这只是脚本的样本,不是真实的。 @SeanLange
-
@bill - 一个由
SELECT组成但没有FROM子句的查询总是产生恰好一行。EXISTS检查特定子查询是否产生任何行。它不检查行中的 what,因此 whatsvf返回无关紧要(实际上可以通过 1、0、NULL、任何东西)
标签: sql-server exists scalar-subquery