最近我通过过滤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来理解他们的意思。
答案 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。