关于UNION的一个问题
SELECT * FROM (SELECT TOP 5 A,B FROM T1 WHERE C=1 ORDER BY T DESC UNION SELECT TOP 5 A,B FROM T1 WHERE C = 0 ORDER BY T DESC) DERIVEDTBL ORDER BY C DESC
解释一下 A,B是查询的内容 T是时间 C是一个标志,可以理解成男女
问题来了:i
假定满足条件C = 1的没有记录
满足条件C = 0 的有 10条记录
那么他最后肯定返回五条记录,这个没有问题
问题在于返回的这五条记录不是按照T来排序的
意思就是 他返回的是满足条件的前五条记录
而不是按照我要求的T来排序的,给人的一种错觉就是记录没有添加成功
何解?
如果没看懂可以回帖提问,在线等回复中,感谢各位。
------解决方案--------------------问题在于返回的这五条记录不是按照T来排序的??
SELECT * FROM (SELECT TOP 5 A,B FROM T1 WHERE C=1 ORDER BY T DESC UNION SELECT TOP 5 A,B FROM T1 WHERE C = 0 ORDER BY T DESC) DERIVEDTBL ORDER BY C DESC,T DESC
??
------解决方案--------------------select * from T1 a where 5> (select count(1) from t1 b where b.c= a.c and b.t > a.t group by C)
order by C DESC,T DESC
------解决方案--------------------因为你最后没有按照T排序
最好不要用 SELECT TOP ... ORDER BY...., 这种写法效率不高
------解决方案--------------------declare @tb table (C INT,T DATETIME DEFAULT GETDATE())
DECLARE @I INT
SELECT @I = 1
INSERT INTO @TB (C,T) SELECT RAND(CHECKSUM(NEWID()))*10,CAST( RAND(CHECKSUM(NEWID()))*10000 AS DATETIME)FROM MASTER..SYSOBJECTS
SELECT C,MAX(T) MAX,MIN(T) MIN FROM @TB WHERE C IN (0,1) GROUP BY C
/**********************
语句1 原始语句 结果错误
**********************/
SELECT ' ' '语句1 ',* FROM (
SELECT TOP 5 C,T FROM @TB WHERE C=0 ORDER BY T DESC
UNION
SELECT TOP 5 C,T FROM @TB WHERE C=1 ORDER BY T DESC
) TB ORDER BY C ,T DESC
/**********************
语句2 改进后的语句1 结果正确
**********************/
SELECT ' ' '语句2 ',* FROM(
SELECT * FROM(
SELECT TOP 5 C,T FROM @TB WHERE C=0 ORDER BY T DESC )T1
UNION ALL
SELECT * FROM(
SELECT TOP 5 C,T FROM @TB WHERE C=1 ORDER BY T DESC )T1
)TB ORDER BY C ,T DESC
/**********************
语句3 我给你的语句 结果正确
我做了点修改
**********************/
select ' ' '语句3 ',* from @TB a where 5> ISNULL((select count(1) from @TB b where b.c= a.c and b.t > a.t group by C),0)
AND C IN (0,1)
order by C ,T DESC
/*****************************************
在查询分析器中打开“显示执行计划”并执行该脚本。
然后查看执行计划,你会发现语句1和语句2最大的区别是---
语句1只是在外部作了一次ORDER BY,并没有在内部执行ORDER BY 操作。
所以结果差强人意。
看了就知道为什么了
******************************************/
------解决方案--------------------SELECT TOP 5 A,B FROM T1 WHERE C=1 ORDER BY T DESC UNION SELECT TOP 5 A,B FROM T1 WHERE C = 0 ORDER BY T DESC
这本身就是个病句,不会执行的吧