"建议不依赖于ID列值,insTead更喜欢CTE"

时间:2016-11-28 06:44:51

标签: sql-server

最近我通过过滤ID编写了一个用于选择查询的存储过程,如下所示:

create procedure procname(@compId as int)
as
begin
select Id,value,text 
from tableName
where Id not in(5,8,19)
and compId =@compId
order by text asc

不幸的是,我的潜在客户提供的邮件就像

一样
  

此处不建议依赖于Id列值。通过CTE(公用表表达式)明确选择它们所代表的内容是非常优选的。

在这里,我无法通过谈论CTE来理解他们的意思。

1 个答案:

答案 0 :(得分:1)

最有可能的是,您的团队负责人担心,从业务逻辑的角度来看,Id not in (5, 8, 19)可能没有任何意义。我的意思是,您将查询限制为某些Id值,但这些数字本身是任意的。

作为可能导致潜在客户的一个例子。警告消失,如果有一些列,比如说some_col,它们对Id值5,8,19都没有相同的值,而没有其他值,那么您可以按如下方式修改查询:

select Id, value, text 
from tableName
where some_col != 'some value'

现在,你的查询背后的逻辑是明确的;您想要某个列没有特定值的记录。如果要更改Id值,原始查询可能会中断,但现在这种可能性要小得多。如果稍后您必须在Id子句中添加新的IN值,那么现在就不会这样做。

如果必须明确引用Id值,那么潜在客户会建议您使用CTE拍摄基础表的快照。这是解决查询中硬编码随机数的另一种方法,但我更喜欢我的第一个建议,即完全取消ID。