我在一个声明中有一个关于子查询的非常奇怪的问题。
一点背景:
我们为我们的产品提供服务,我首先获得用户有权访问的所有产品。之后,我将过滤掉客户不想要的产品。
我使用参数化临时表和删除查询来实现这一点..
因此,这就是我们的大多数查询的样子:
DELETE FROM @total
WHERE Number NOT IN (SELECT Id
FROM ProductTable
WHERE Something = @something)
出错的地方是我们尝试过滤日期时间
在存储过程中使用以下内容时
DELETE FROM @total
WHERE Number NOT IN (SELECT *
FROM ProductTable
WHERE DateTimeColumn > @ParameterDateTime)
如果我们在存储过程之外使用此子查询,它可以在几秒钟内完成。在存储过程中,它需要81500毫秒
我们已尝试将with (nolock)
添加到表中,但这并没有改变任何内容。
在执行删除之前添加临时表中的所有内容,然后根据临时表进行删除确实有效。
SELECT PackagedProductId
INTO #temp2
FROM ProductTable WITH(NOLOCK)
WHERE DateTimeColumn > @ParameterDateTime
DELETE FROM @total
WHERE Number NOT IN (SELECT * FROM #temp2)
我的问题如下:
如果您需要有关此主题的更多信息,请随时提出。
DECLARE @total IntListType; --IntListType = User defined table type
CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL)
答案 0 :(得分:0)
放手一搏
DELETE FROM @total
WHERE NOT EXISTS (SELECT 1
FROM ProductTable
WHERE Id = @total.Number
AND Something = @something)
或
DELETE FROM @total
WHERE NOT EXISTS (SELECT 1
FROM ProductTable
WHERE Id = @total.Number
AND DateTimeColumn > @ParameterDateTime)