select rowid int identity(1,1),* into #temp from 表A select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
写错了,更正: select identity(1,1) rowid,* into #temp from 表A select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
加一个:select a.data-b.data from 表a a,表a b where a.Aid>b.aid and b.aid in (select max(aid) from 表a where aid<a.aid)
select a.data-b.data from 表a a,表a b where b.aid = (select max(aid) from 表a where aid<a.aid)
补充: select a.data-b.data from 表a a,表a b where b.aid in (select max -------------------------------------------^^^去掉and也行呀! (aid) from 表a where aid<a.aid)
哦! CCEO()大侠已经发现了!呵呵!
多谢各位的帮助,我来总结一下:pengdali(大力)的方法是程序化的方法,比较容易理解。缺点在于似乎只适用于MSSQL,移植性不好。j9988(j9988)的方法很好,效率也不错,不过正像pengdali(大力)所说,还有化简的余地。主要就是 a.AId>b.AId 这个条件其实没必要。CCEO()的结果可以看作是在j9988(j9988)的基础上化简而得。其实像最后CCEO()写出来的这个语句,我更喜欢写成这样:SELECT a.Data - b.Data AS DataDiff FROM 表A a INNER JOIN 表A b ON b.AId = (SELECT MAX(AId) FROM 表A WHERE AId < a.AId)我比较喜欢用INNER JOIN而不是CROSS JOIN,呵呵。我觉得INNER JOIN快一点,可能是心理作用吧,执行效率应该是一样的,可能不同的数据库系统还有不同的内部处理方法。很高兴能解决这个问题,给分。
有句话不得不说: select ... from a,b where a.id=b.id 不是CROSS JOIN,而是inner join
我说呀,我也觉得奇怪,应该是INNER JOIN的。但是当我在MSSQL EnterpriseMan中查询输入select a.data-b.data from TestA a,TestA b where b.aid = (select max(aid) from TestA where aid<a.aid)系统自动就给格式化成这样了: SELECT a.Data - b.Data AS Expr1 FROM TestA a CROSS JOIN TestA b WHERE (b.AId = (SELECT MAX(aid) FROM TestA WHERE aid < a.aid))不然你自己试试?可能是与WHERE字句有关系,如果WHERE字句是where a.id=b.id,当然就应解释成INNER JOIN;如果WHERE字句复杂一些,可能就解释成CROSS JOIN。
select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
select identity(1,1) rowid,* into #temp from 表A
select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
select a.data-b.data from 表a a,表a b where b.aid in (select max
-------------------------------------------^^^去掉and也行呀!
(aid) from 表a where aid<a.aid)
FROM 表A a INNER JOIN
表A b ON b.AId =
(SELECT MAX(AId)
FROM 表A
WHERE AId < a.AId)我比较喜欢用INNER JOIN而不是CROSS JOIN,呵呵。我觉得INNER JOIN快一点,可能是心理作用吧,执行效率应该是一样的,可能不同的数据库系统还有不同的内部处理方法。很高兴能解决这个问题,给分。
select ... from a,b where a.id=b.id
不是CROSS JOIN,而是inner join
SELECT a.Data - b.Data AS Expr1
FROM TestA a CROSS JOIN
TestA b
WHERE (b.AId =
(SELECT MAX(aid)
FROM TestA
WHERE aid < a.aid))不然你自己试试?可能是与WHERE字句有关系,如果WHERE字句是where a.id=b.id,当然就应解释成INNER JOIN;如果WHERE字句复杂一些,可能就解释成CROSS JOIN。