请大家帮忙解答这个关于order by 丢失数据的问题
以下用的是pubs..employee 表:
declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
order by hire_date
print @str
===========================
结果为:Rita -
declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
--order by hire_date
print @str
===========================
结果为:Paul - Carlos - Janine - Laurence - Rita - Sven - Maria -
select * from employee where job_id = 5
===========================
这条SQL明明有7条记录,为什么当我用变量累加的时候,当我用order by的时候会丢失数据,不明白其中的道理,希望有高手解答,也提醒大家有类似的情况要多加注意,因为这个问题让我调了一下午都不知道问题出现在哪
[解决办法]
在我的电脑上显示的结果都一样啊!
[解决办法]
怎麼我得到的結果不一樣?
Use Pubs
GO
declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
order by hire_date
print @str
set @str = ' '
select @str = @str + fname + ' - ' from employee where job_id = 5
--order by hire_date
print @str
GO
--Result
/*
Maria - Carlos - Laurence - Sven - Janine - Paul - Rita -
Paul - Carlos - Janine - Laurence - Rita - Sven - Maria -
*/
[解决办法]
我这里也是一样的。。。
[解决办法]
没碰过这样的情况,按照理论不会出这样的情况,只有次序先后不一样的情况。
[解决办法]
他的意思是加了order by 数据就变成只有一个了。。。
---
===========================
结果为:Rita -
[解决办法]
还真的第1次发现这样的情况,呵呵
看看
[解决办法]
我就是將兩種情況放在一起測試,所以就一個是注釋掉的,一個沒有注釋掉撒。
[解决办法]
不过我的执行后,结果一样
[解决办法]
结果一样,
是不是没有打patch.
[解决办法]
邹老大,还是厉害!早就知道这问题。
[解决办法]
你说的是那个patch
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
[解决办法]
sp4
[解决办法]
晕,打了sp4就不对了?那我不打了
[解决办法]
:)
[解决办法]
是于原因,真的找不到什么理论可以解释,只有MS了,呵呵。在临时表中使用ORDER BY又是另一种情况。
这样的问题,可以这样解决,只供参考:
declare @str varchar(1000)
set @str = ' '
select @str = @str + fname + ' - ' from
(Select top 100 percent fname From
employee where job_id = 5
order by hire_date
) AS S
print @str
/*
Maria - Carlos - Laurence - Sven - Janine - Paul - Rita -
*/
[解决办法]
有沒有誰和樓主出現一樣的結果了?
好象我第一次執行我寫的那段代碼,和樓主的結果是一樣,但是後來就不一樣了,而且也執行不出那樣的結果了。
[解决办法]
我的也是2000的,繁體版的。
[解决办法]
能不能教一下怎么改?
[解决办法]
我的机器上也出这个问题,是sql server2000的bug吗?
[解决办法]
以下为转载:特说明
问题重现代码
-- 测试数据
DECLARE @T TABLE(id int,value nvarchar(16))
INSERT INTO @T SELECT
1, N '好人 ' UNION ALL SELECT
2, N '坏人 ' UNION ALL SELECT
3, N '吃饭 ' UNION ALL SELECT
4, N '垃圾 '
-- 赋值处理
DECLARE @str nvarchar(4000)
SET @str = N '我不是一个好人,也不是垃圾 '
SELECT @str = REPLACE(@str, value, N ' <u> ' + value + N ' </u> ')
FROM @T
WHERE CHARINDEX(value, @str) > 0
--ORDER BY CHARINDEX(value, @str) DESC
SELECT @str
/* -- 结果(当赋值处理语句注释掉ORDER BY 时)
我不是一个 <u> 好人 </u> ,也不是 <u> 垃圾 </u>
-- */
/* -- 结果(当赋值处理语句加上ORDER BY 时)
我不是一个 <u> 好人 </u> ,也不是垃圾
-- */
从上面的列表可以看出,两种处理的最大差异,在于赋值前,是否有ORDER BY 子句,从一般的理解上,可能会认为是否排序并不重要,但换个角度来看问题,就比较容易理解为什么有ORDER BY子句后得不到我们想要的结果了:
当有ORDER BY子句时,对于SELECT @str = 这种赋值处理,SQL Server认为赋值处理肯定只会保留最后一条记录的处理结果,而ORDER BY子句确定了数据顺序,也就知道最后一条记录是那个,因此只会处理ORDER BY的最后一条记录。(读者可以自行去测试一下,调整ORDER BY顺序,看看结果是否与我的推论相符)
当没有ORDER BY子句时,因为无法确定数据顺序,所以SQL Server必须扫描满足条件的每条数据来得到结果,这样每扫描一条记录都会处理一次,所以结果是我们所预知的
问题解决方法:
修改处理语句,使查询优化器使用与我们需要结果一致的执行方法,可以解决这个问题。
对于示例中的处理语句,可以调整如下:
DECLARE @str nvarchar(4000)
SET @str = N '我不是一个好人,也不是垃圾 '
SELECT @str = REPLACE(@str, value, N ' <u> ' + value + N ' </u> ')
FROM(
SELECT TOP 100 PERCENT
value
FROM @T
WHERE CHARINDEX(value, @str) > 0
ORDER BY CHARINDEX(value, @str) DESC
)A
SELECT @str