使用SQL 2008R2
我们有几个系统都可以提供生产流程。我们从这些报告中获取报告,需要按工作确定成本。我们从某些流程获得的参考号是所有可能或可能不以作业号开头的变量(例如生产作业或非生产作业)。在许多情况下,我们无法控制参考字段的格式。
例如:
“50000_A工作”是Job No 50,000 “50001_A不同的工作”是Job No 50,001 “100_TGE”是非生产性工作。我只知道这是因为100不是生产工作没有(太短)。会有一些错误识别的%非常小,所以我们可以忍受它
从这些我必须弄清楚什么是生产工作。我每年都会有一份有效的JobNo表,所以2014年是50,000到85,000,2015年是85,001到120,000。
所以我必须:
我可以用
做第一步SELECT LEFT(Reference,(CHARINDEX('_',Reference)-1)) -- need to work with 5 and 6 digit nos
我有一个UDF(性能杀手)来测试它是否真的是一个int
如果我使用内连接
,我猜3和4可以合并所以我离开了
Select reference from log
Inner join jobs on jobs.jobno = IsReallyInt(LEFT(log.Reference,(CHARINDEX('_',log.Reference)-1)))
表现不会是出色的
这些引用涵盖了几个不同的第三方和内部数据库。在某些情况下,我们可以添加计算列以隔离其自己的字段中的作业,但有些不能修改。
任何人都有更高效的方法吗?
此致
标记
答案 0 :(得分:1)
这是您的查询:
Select reference
from log Inner join
jobs
on jobs.jobno = IsReallyInt(LEFT(log.Reference, CHARINDEX('_', log.Reference) - 1))
IsReallyInt()
是不必要的。你可以使用`NOT LIKE'%[^ 0-9]%'。但是,我不认为你实际上需要提取整数。您可以直接与作业编号进行比较。所以,试试这个:
Select reference
from log Inner join
jobs
on log.Reference like jobs.jobno + '[_]%'
这也是一场表现。但是,它可能会利用log.reference
上的索引。