Mic*_*l A 2 sql t-sql database sql-server-2008
我昨天发布了以下问题:where子句中的多个'in'语句需要相互匹配
在这里有一些关于Oracle中的一个功能的讨论在Microsoft SQL中不存在,具体的代码行是:
where (suite_id,lease_id) in (('CCBG08','205059'),('CCBG14','152424'),('CCCF048','150659'))
Run Code Online (Sandbox Code Playgroud)
假设我们有一个表(但有更多行):
suite_id lease_id
CCBG08 150659
CCBG14 152424
我在此推断为Microsoft SQL创建以下解决方案:
select *
from property.lease_period
where (suite_id + ' ' + lease_id)
in (
('CCBG08 205059'),
('CCBG14 152424'),
('CCCF048 150659')
)
Run Code Online (Sandbox Code Playgroud)
不幸的是,做这样的事情对性能的影响是非常显着的(因为没有使用索引).我想知道如何改进这个?
大概我们在这里讨论动态生成的SQL,对吧?那么,在这种情况下,为什么不使用长形式:
select *
from property.lease_period
where
(suite_id = 'CCBG08' AND lease_id = '205059') OR
(suite_id = 'CCBG14' AND lease_id = '152424') OR
(suite_id = 'CCCF048' AND lease_id = '150659')
Run Code Online (Sandbox Code Playgroud)
编辑 重新阅读原始帖子,我看到这基本上是你开始的,并希望避免.考虑到这一点,您可以通过创建property.lease_period的视图,将您发布的方法(字符串连接值)与索引一起使用,并在该视图中包含计算列(例如,suite_id +''+ lease_id为suite_lease).最后,在该列上为该视图创建索引.然后更改代码以从此新视图和列中进行选择,而不是从基表中进行选择.