微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 删除重复的子查询

我有一个复杂的SQL查询可以简化如下:
Select ColA,ColB,ColC,ColD
From MyTable
Where (ColA In (Select ItemID From Items Where ItemName like '%xxx%') 
    or ColB In (Select ItemID From Items Where ItemName like '%xxx%'))

您可以看到,子查询出现两次.编译器是否足够聪明,可以检测到这一点,并且只得到子查询的结果一次?还是子查询运行两次?

FYI,表项有约20,000行,MyTable有大约20万行.

是否有另一种方式来重写此sql语句,以便子查询出现/运行一次?

更新:主查询中的Where子句是动态的,仅在需要时添加(即仅当用户搜索“xxx”时).因此,对主选择语句的更改或查询的重新构造是不可能的.

解决方法

更新您的请求不更改查询,只是WHERE

您可以直接将CTE打包到调用的地方(未经测试):

Select ColA,ColD
From MyTable
Where EXISTS (SELECT 1 FROM (Select i.ItemID 
                             From Items AS i 
                             Where iItemName like '%xxx%') AS itm 
              WHERE itm.ItemID=MyTable.ColA OR itm.ItemID=MyTable.ColB)

以前

我认为这应该是一样的

WITH MyCTE AS
(
    Select ItemID From Items Where ItemName like '%xxx%'
)
Select ColA,ColD
From MyTable
Where EXISTS (SELECT 1 FROM MyCTE WHERE ItemID=ColA OR ItemID=ColB)

一个子字符串LIKE搜索是肯定的 – 不是性能的.

如果您可以使用LIKE过滤器将“项目”减少到几行,那么您必须测试哪个是最快的.

原文地址:https://www.jb51.cc/mssql/79126.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐