gpt4 book ai didi

sql - 如果值可以转换为 INT,我如何强制 SQL 仅评估连接?

转载 作者:行者123 更新时间:2023-12-04 14:41:56 25 4
gpt4 key购买 nike

我有一个使用多个子查询的查询。它大约有 100 行,所以我将其省略。问题是我有几行作为一个子查询的一部分返回,需要从主查询连接到一个整数值。像这样:

Select 
... columns ...
from
... tables ...
(
select
... column ...
from
... tables ...
INNER JOIN core.Type mt
on m.TypeID = mt.TypeID
where dpt.[DataPointTypeName] = 'TheDataPointType'
and m.TypeID in (100008, 100009, 100738, 100739)
and datediff(d, m.MeasureEntered, GETDATE()) < 365 -- only care about measures from past year
and dp.DataPointValue <> ''
) as subMdp
) as subMeas
on (subMeas.DataPointValue NOT LIKE '%[^0-9]%'
and subMeas.DataPointValue = cast(vcert.IDNumber as varchar(50))) -- THIS LINE
... more tables etc ...

问题是,如果我取出 cast(vcert.IDNumber as varchar(50))),它将尝试将“daffodil”之类的值与 3245 这样的数字进行比较。即使包含“daffodil”的数据点是一个孤立记录,应该通过其上方的 INNER JOIN 4 行过滤掉。如果我尝试将一个字符串与一个字符串进行比较,它工作正常,但如果我尝试将一个字符串与一个 int 进行比较,它就会爆炸——尽管我在那里有一个子句只查看可以转换为整数的东西:不像“%[^0-9]%”。如果我专门过滤掉包含“daffodil”的记录就可以了。如果我将 NOT LIKE 行移动到子查询中,它仍然会失败。这就像无论我做什么,最后评估 NOT LIKE 一样。

所以真正的问题是,为什么 SQL 会在评估子查询中包含的 WHERE 子句之前先评估 JOIN 子句。另外,如果正在评估的值可转换为 INT,我如何强制它仅评估 JOIN 子句。还有为什么它会评估在应用 INNER JOIN 后绝对不会出现的记录。

我知道这里有很强的查询优化器巫术元素。另一方面,我告诉它执行 INNER JOIN,而优化器专门忽略了它。我想知道为什么。

最佳答案

您遇到的问题在 this item of feedback 中讨论在连接站点上。

虽然逻辑上您可能希望过滤器排除任何包含任何非数字字符的 DataPointValue 值 SQL Server 似乎在此之前在执行计划中对 CAST 操作进行排序过滤器发生。因此错误。

在 Denali 及其 TRY_CONVERT 函数出现之前,解决这个问题的方法是将列的用法包装在一个 case 表达式中,该表达式重复与过滤器相同的逻辑。

关于sql - 如果值可以转换为 INT,我如何强制 SQL 仅评估连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com