日期:2014-05-18  浏览次数:20613 次

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