删除重复的子查询

nav*_*tor 12 sql t-sql sql-server dynamic-sql common-table-expression

我有一个复杂的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%'))
Run Code Online (Sandbox Code Playgroud)

如您所见,子查询出现两次.编译器是否足够智能来检测它并仅获取子查询的结果一次?或者子查询运行两次?

仅供参考,表项目大约有20,000行,MyTable有大约200,000行.

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

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

Shn*_*ugo 17

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

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

Select ColA,ColB,ColC,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) 
Run Code Online (Sandbox Code Playgroud)

以前

我想这应该是一样的......

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

子串LIKE搜索 - 当然 - 不具备性能.

如果您可以使用LIKE过滤器将"项目"减少到几行,则必须测试哪个最快.

  • @navigator,这是你真正*应该在你的问题中给出的一条信息...... (3认同)