好的,我有一个与之前有过的问题有关的问题。我知道如何解决它,但我们在尝试重现错误时遇到了问题。
我们有一系列基于其他记录创建记录的程序。记录通过link_id
链接到主记录。在抓取此link_id
的过程中,查询为
select @p_link_id = id --of the parent
from table
where thingy_id = (blah)
现在,活动表中有多行。有些可以取消。我所拥有的代码不会消除select语句中已取消的行,因此如果以前取消了行,则这些ID将出现在select中。如果我取消已取消的行,则总会有一个“打开”记录被选中。 (追加where status != 'C'
)
这解决了这个问题。但是,我需要能够在我们的开发环境中重现该问题。
我已经完成了一个过程,我已经输入了一大堆数据,打开,取消等等,试图让这个select语句返回一个无效的id。但是,每当我运行select时,id都是有序的(生成序列),但是在发生此错误的情况下,select语句返回了似乎是变量中的第一个值。
例如。
ID Status
1 Cancelled
2 Cancelled
3 Cancelled
4 Open
鉴于上述情况,如果我选择了我想要的ID,我想得到'4'。在错误中,结果为1.但是,即使我输入10个已取消的记录,我仍然会在选择中获得最后一个。
在oracle中,我知道如果你选择一个变量并且返回了多个记录,那么你会收到一个错误(我认为)。 Sybase显然可以将多个值分配给变量而不会出错。
我在考虑是否与从表中选择数据的方式有关,其中没有排序顺序的id不按升序返回,或者有一个dboption,其中选择变量将保存查询的第一个或最后一个值。
编辑:看起来我们可以通过回滚存储过程更改来重现此错误。但是,procs不会在这个link_id列附近。是否有可能对数据库体系结构进行更改可能会破坏索引或其他内容?
答案 0 :(得分:2)
如果返回多行,则根据this,存储的值将是列表中的 last 值。
如果您没有通过ORDER BY
指定检索订单,则返回的订单将方便数据库引擎。它可能因数据库实例而异。它可能是按照创建的顺序,或者甚至是“随机”的,因为数据放在数据库块结构中的位置。
故事的寓意:
SELECT
返回单行ORDER BY
确保您关注的人最后