关于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 
 这本身就是个病句,不会执行的吧