t-sql JOIN where子句的最佳实践

时间:2015-07-27 16:42:02

标签: sql-server tsql relational-database

我有以下查询:

SELECT s.LogonId "StaffId" FROM [dbo].[SQMap] sq
INNER JOIN [dbo].[Staff] s ON s.Id = sq.StaffId
INNER JOIN [dbo].[Queue] q ON q.Id = sq.QueueId
WHERE sq.QueueId = @queueId AND q.IsAuto = 1 

我被要求更改查询以向where子句

添加更多条件
WHERE sq.QueueId = @queueId 
AND q.Id = @queueId
AND q.IsAutoAssigned = 1 

我想知道是否真的需要 q.Id = @queueId 。我看到很多查询都有这种冗余条件。这些确实是必需的。什么是最佳做法?

2 个答案:

答案 0 :(得分:0)

我唯一一次看到故意用于良好影响的重复条件就是试图让查询优化器提出更好的计划。但那是几年前在不同的关系数据库上。使用现代优化器,添加重复条件将很少改变计划。要查看的方法是运行两个查询并查看计划是否不同。

答案 1 :(得分:-1)

当然需要它。如果查询不包含您要过滤的特定queueId(假设您要对其进行过滤),那么所有QueueIds的所有记录都将是回。

但它不必存在两次,并且由于连接条件限制输出仅包含来自dbo.Queue的{​​{1}}与queueId匹配的记录,其中dbo.SQLMap放置where谓词任何一个都会限制两个表。