我需要获取另一个表的列中不存在的值。目前我正在使用的是
and [tPlayerTag].TagId NOT IN (select RequiredTagId from dbo.tPrize(NOLOCK)
where RequiredTagId is not null)
这存在于我的where子句中。 它的工作完全正常,但我认为当处理较大的表(tPrize)时,它可能会减慢查询速度。有没有更快的方法可以重写此逻辑?
答案 0 :(得分:1)
您可以使用not exists
当然,要一个接一个地选择取决于一种情况:驱动查询和驱动查询返回的数据量。对于[NOT] IN operator
,内部查询(..where中的ID(从表中选择ID))是驱动查询,而对于[NOT] EXISTS
,外部查询是驱动查询。因此,如果子查询(内部查询)返回少量数据是由于子查询中的表包含少量行或者对子查询应用了密集过滤[NOT] IN运算符可能会提供更好的性能。如果子查询返回大量数据,或者在外部查询中进行了主要过滤,则[NOT] EXISTS operator
是首选。
and [tPlayerTag].TagId NOT exists (select RequiredTagId from dbo.tPrize(NOLOCK)
where RequiredTagId is not null)
答案 1 :(得分:1)
您可以使用in
代替exists
,也可以not in
代替not exists
并尝试这样,它将起作用。
在性能方面,您必须使用not exists
[tPlayerTag].TagId NOT exists (select RequiredTagId from dbo.tPrize(NOLOCK)
where RequiredTagId is not null)
答案 2 :(得分:1)
我强烈建议您使用not exists
而不是not in
,因为NULL
的值不会影响结果。由于您的where
子句,您似乎知道这是一个问题。
表达式是:
NOT EXISTS (SELECT 1
FROM dbo.tPrize p
WHERE p.RequiredTagId = tPlayerTag.TagId
)
为了提高性能,您希望在tPrize(RequiredTagId)
上建立索引。该指数将使性能更具可扩展性。