读书人

not exists 求解。很迷惑不知道他是

发布时间: 2012-01-18 00:23:26 作者: rapoo

not exists 求解。很迷惑,不知道他是怎么执行的。。。。谢谢!
create table SendTime(号码 int,发送时间 Datetime)

Insert SendTime Select 1381, '2007-08-02 17:51:00.000 '
Union ALl Select 1381, '2007-08-02 18:26:00.000 '
Union ALl Select 1382, '2007-08-02 19:31:00.000 '
Union ALl Select 1381, '2007-08-03 11:21:00.000 '

求每个号码每天发送时间最晚的记录

Select * From SendTime A Where Not Exists
(Select 1 From SendTime Where 号码=A.号码 And
Convert(Varchar(10),发送时间,120)=Convert(Varchar(10),A.发送时间,120) And
发送时间> A.发送时间)
Order By 号码,发送时间

结果:
13812007-08-02 18:26:00.000
13812007-08-03 11:21:00.000
13822007-08-02 19:31:00.000

请大家给我一步一步解释一下上边这条语句的执行过程吧!为什么是 select 1呢?
看了帮助还是不清楚啊!


[解决办法]
Select * From SendTime A Where Not Exists
(Select 1 From SendTime Where 号码=A.号码 And
Convert(Varchar(10),发送时间,120)=Convert(Varchar(10),A.发送时间,120) And
发送时间> A.发送时间)
Order By 号码,发送时间

--------------------
是逐判的。

首先第一,看看SendTime表中,有有号码和前相同,且是今天的,比前大的,有。

,就不足Not Exists件,所以第一去掉。

然後第二,SendTime表中有号码和前相同,且是今天的,比前大的。

就足Not Exists件,所以一保留。

以下似.
[解决办法]
--这样写不是更简单些吗?
declare @table table (号码 int,发送时间 Datetime)

Insert @table Select 1381, '2007-08-02 17:51:00.000 '
Union ALl Select 1381, '2007-08-02 18:26:00.000 '
Union ALl Select 1382, '2007-08-02 19:31:00.000 '
Union ALl Select 1381, '2007-08-03 11:21:00.000 '

SELECT 号码,CONVERT(VARCHAR(10),发送时间,102) AS 发送日期,max(发送时间)AS 发送时间
FROM @table GROUP BY 号码,CONVERT(VARCHAR(10),发送时间,102)

读书人网 >SQL Server

热点推荐