2016-11-28 49 views
0

最近我通过过滤ID的像下面写了选择查询存储过程:“敬告不依赖于ID列值,而不是喜欢CTE”

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

不幸的是我的引线提供邮件像

不建议在这里依赖Id列值。明确选择它们通过CTE(公用表表达式)表示的内容是非常优选的。

在这里,我无法完全理解CTE的含义。

+0

你的程序中的@compId参数是什么?它在您的查询中未被引用。 –

+0

编辑请检查一次。 –

+1

没有解释就冷静下来的人是匿名懦夫。也许他/她低估了,因为你没有添加任何解释你为什么将'id'限制在一定的值上。如果你想对你的问题得到正确的答案,所有相关的背景都很重要。 –

回答

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值曾经发生变化,您的原始查询可能会中断,但现在这种可能性要小得多。如果在稍后的某个时间点,您不得不在IN条款中添加新的Id值,您现在就不会这样做。

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

+0

我了解你的第一个建议。但无法理解为什么以及如何选择CTE。据我所知,我们会在递归的情况下去CTE。 –

+1

我认为他们只是不希望你硬编码这些ID到你的存储过程。通过创建CTE,可以监视逻辑,理想情况下,您可以用更有意义和更稳定的内容替换硬编码的ID。 –

+0

如果你明白你能否请用CTE为上述查询构造代码? –