在where子句中避免表函数?

Posted

技术标签:

【中文标题】在where子句中避免表函数?【英文标题】:Avoid table function in where clause? 【发布时间】:2019-09-07 05:43:02 【问题描述】:

我在where 子句中添加了表函数。

select cmp_id, acno_code, sl_type, sl_code, 0 op_Dr, 0 op_cr, 0 tr_Dr, sum(amount) tr_Cr                                                  
from vf_finance                    
where cmp_id =@cmp_id1         
and unitcode in (select * from UTILfn_Split( @unit_code,',') )   
and stat_code in ('AT','PR' )        
--and pc_code  in (select * from UTILfn_Split( @sba,',') )        
AND DOC_dT >=convert(datetime,@from_date,103) and doc_Dt <= convert(datetime,@to_date,103)                                                  
and amount < 0                     
GROUP BY cmp_id, acno_code, sl_type, sl_code                                                   
)  as gl                                                 
inner join ps_Accmas acc on acc.cmp_id = gl.cmp_id and acc.acno_Code = gl.acno_code                                                   
inner join ps_owner o on gl.cmp_id = o.cmp_id                                                   
left outer join view_sl_code sl on gl.cmp_id = sl.cmp_id and gl.sl_type = sl.sl_type and gl.sl_Code = sl.sl_Code                                                  
inner join ps_slType slt on gl.cmp_id = slt.cmp_id and gl.sl_Type = slt.sl_type  
where  sl.sl_type in (select * from UTILfn_Split( @sl_type,',') )     
and acc.acno_code in(select * from UTILfn_Split( @facno_code,',') )                             
group by gl.cmp_id, gl.acno_code,gl.sl_code,gl.sl_type,slt.sl_DEsc,acc.acno_DEsc, sl.sl_DEsc, o.owner_name                  
order by gl.cmp_id, gl.acno_code,gl.sl_code,gl.sl_type 

谁能建议我如何避免where 子句中的功能?

【问题讨论】:

你试过inner join UTILfn_Split(@sl_type, ',') sl2 on sl2.Value=sl.sl_type吗?此外,SQL Server 2016 及更高版本具有内置 STRING_SPLIT() function 再次检查您的查询,) as gl 似乎没有起始括号....检查并先更正 【参考方案1】:

你可以试试这个。这个现有查询中存在一些问题,我将首先指出

首先unitcode in (select * from UTILfn_Split( @unit_code,',')在这里你必须使用一个列名而不是*,虽然我不知道你的函数UTILfn_Split但还是提到列名是更可取的。

对于您的查询,您可以使用 inner join 而不是 in 与具有返回类型表的函数。

而不是

sl.sl_type in (select * from UTILfn_Split( @sl_type,',') ) 

你可以试试这个

yourtble as sl inner join 
(select value from UTILfn_Split( @sl_type,',') as t2 
on sl.sl_type = t2.[value]     ---- here column name with t2 depends on your function, 
---what table structure is returning, in your case it is [value]

【讨论】:

这是我在函数中的返回类型返回@ValueTable table ([Value] nvarchar(max)) 你可以用inner join 替换你所有的in 子句,就像我在上面的代码中所做的那样......

以上是关于在where子句中避免表函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE 子句中使用类似 WINDOW 的函数对表进行 SQL 更新

Oracle 索引失效

如何强制 where 子句中的函数在 oracle 中执行一次?

where 后面可以接聚合函数吗

始终选择表中所有记录的 WHERE 子句

WHERE 子句中的 CASE