select结果集顺序问题
--1.执行脚本
drop table tps_t
go
create table tps_t(
dcmttp u_dcmttp not null,
dcmtno u_dcmtno not null
)
go
drop table #tps
go
create table #tps(
dcmttp u_dcmttp not null,
dcmtno u_dcmtno not null
)
go
insert tps_t values('731', '000000001')
insert tps_t values('731', '000000002')
insert tps_t values('731', '000000003')
insert #tps values('731', '000000001')
go --标记A
select * from tps_t
declare @var varchar(100)
update tps_t set
@var=@var+b.dcmtno
from #tps a, tps_t b
wherea.dcmttp=b.dcmttp
anda.dcmtno=b.dcmtno
select * from tps_t
--2.返回结果:
dcmttp dcmtno
------ ------
731 000000001
731 000000002
731 000000003
dcmttp dcmtno
------ ------
731 000000002
731 000000003
731 000000001
--3.问题:为什么两个select的结果顺序不一样?这个顺序由什么来决定?脚本中update语句为什么会对这个顺序产生影响?脚本中标记A的"go"如果拿掉后两个select结果顺序会一样,为什么?
[解决办法]
其实数据库理论中的一个重要概念就是表中的记录是没有顺序的。
估计,是当你的UPDATE中的JON a.dcmttp=b.dcmttp and a.dcmtno=b.dcmtno导致了顺序的改变。
[解决办法]
2楼结果是否顺序有变?
按道理讲,顺序应该不变,你的表中没有主键、索引,只是变量累加,隐式内连接
[解决办法]
在ASA中测试一下,没有这种情况
[解决办法]
顺序有自然、逻辑两种,
如果没有索引,SELECT是按照自然顺序(先进入的在前面),
如果有,则SELECT是按照逻辑顺序显示记录,
虽然两者的物理位置是一样的,即先进入的在前面
[解决办法]
测试没有得到这样的效果