首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

遇到难题了,是查询分析器的错还是小弟我的错

2012-02-01 
遇到难题了,是查询分析器的错还是我的错?大家先不要管这两条查询语句的业务逻辑是什么,就看这两条语句为什

遇到难题了,是查询分析器的错还是我的错?
大家先不要管这两条查询语句的业务逻辑是什么,就看这两条语句为什么会返回不同的结果?
两条语句对应的exists完全相同,在我看来这两条语句是等价的呀。
--创建测试环境
create   table   #t1(编号   int,部门   varchar(10),日期1   datetime,状态   bit)
create   table   #t2(编号   int,部门   varchar(10),日期2   datetime,状态   bit)
create   table   #t3(编号   int,部门   varchar(10),日期   datetime)

--插入测试数据
insert   #t1(编号,部门,日期1,状态)
select   '10001 ', '01 ', '2007-02-02 ', '0 '   union   all
select   '10002 ', '01 ', '2007-02-06 ', '0 '   union   all
select   '10003 ', '02 ', '2007-02-01 ', '0 '   union   all
select   '10006 ', '02 ', '2007-03-02 ', '0 '   union   all
select   '10001 ', '03 ', '2007-03-01 ', '0 '   union   all
select   '10005 ', '03 ', '2007-03-01 ', '0 '

insert   #t2(编号,部门,日期2,状态)
select   '10003 ', '02 ', '2007-02-10 ', '1 '

insert   #t3(编号,部门,日期)
select   '10001 ', '01 ', '2007-02-03 '   union   all
select   '10002 ', '01 ', '2007-02-10 '   union   all
select   '10003 ', '02 ', '2007-02-06 '   union   all
select   '10006 ', '02 ', '2007-03-02 '   union   all
select   '10001 ', '03 ', '2007-03-01 '   union   all
select   '10005 ', '03 ', '2007-02-22 '   union   all
select   '10005 ', '03 ', '2007-03-02 '

--求解过程1
select   *
from   #t3   t3
where   exists(
            select   1  
            from   #t1   t1  
            where   not   exists--如果表1中有2个以上相同编号则以日期1最大的为条件  
                                    (select   1   from   #t1   where   编号   =   t1.编号   and   日期1   >   t1.日期1)
                        and   t3.编号   =   t1.编号   and   t3.部门   =   t1.部门--表3中的编号和部门同时存在表1中
                        and   not   exists--表3中的编号和部门同时表2中不存在
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门)
            )
           
union   all

select   *
from   #t3   t3
where   exists(
            select   1  
            from   #t1   t1  
            where   not   exists--如果表1中有2个以上相同编号则以日期1最大的为条件
                                    (select   1   from   #t1   where   编号   =   t1.编号   and   日期1   >   t1.日期1)


                        and   t3.编号   =   t1.编号   and   t3.部门   =   t1.部门--表3中的编号和部门同时存在表1中
                        and   exists--表3中的编号和部门同时存在表2中
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门)
                        and   not   exists--当表1.max(日期1)> 表2.max(日期2)才满足条件
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门   and   日期2   > =   t1.日期1)
            )
/*--测试结果
编号                     部门                   日期                                                                                                          
-----------   ----------   -------------------------
10002               01                   2007-02-10   00:00:00.000
10006               02                   2007-03-02   00:00:00.000
10001               03                   2007-03-01   00:00:00.000
10005               03                   2007-02-22   00:00:00.000
10005               03                   2007-03-02   00:00:00.000

(所影响的行数为   5   行)
*/

-----------------------------------------

--求解过程2
select   *
from   #t3   t3
where   exists(
            select   1  
            from   #t1   t1  
            where   not   exists--如果表1中有2个以上相同编号则以日期1最大的为条件  
                                    (select   1   from   #t1   where   编号   =   t1.编号   and   日期1   >   t1.日期1)
                        and   t3.编号   =   t1.编号   and   t3.部门   =   t1.部门--表3中的编号和部门同时存在表1中
                        and   not   exists--表3中的编号和部门同时表2中不存在
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门)


            )
            or   exists(
            select   1  
            from   #t1   t1  
            where   not   exists--如果表1中有2个以上相同编号则以日期1最大的为条件
                                    (select   1   from   #t1   where   编号   =   t1.编号   and   日期1   >   t1.日期1)
                        and   t3.编号   =   t1.编号   and   t3.部门   =   t1.部门--表3中的编号和部门同时存在表1中
                        and   exists--表3中的编号和部门同时存在表2中
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门)
                        and   not   exists--当表1.max(日期1)> 表2.max(日期2)才满足条件
                                    (select   1   from   #t2   where   编号   =   t1.编号   and   部门   =   t1.部门   and   日期2   > =   t1.日期1)
            )
                       
--删除测试环境
drop   table   #t1,#t2,#t3

/*--测试结果
编号                     部门                   日期                                                                                                          
-----------   ----------   -----------------------------
10002               01                   2007-02-10   00:00:00.000
10003               02                   2007-02-06   00:00:00.000
10006               02                   2007-03-02   00:00:00.000
10001               03                   2007-03-01   00:00:00.000
10005               03                   2007-02-22   00:00:00.000
10005               03                   2007-03-02   00:00:00.000

(所影响的行数为   6   行)
*/


           




[解决办法]
逻辑太乱

不堪逻辑是不可能看出两个语句的区别的

------解决方案--------------------


编号 部门 日期
----------- ---------- ------------------------------------------------------
10002 01 2007-02-10 00:00:00.000
10006 02 2007-03-02 00:00:00.000
10001 03 2007-03-01 00:00:00.000
10005 03 2007-02-22 00:00:00.000
10005 03 2007-03-02 00:00:00.000

(所影响的行数为 5 行)

编号 部门 日期
----------- ---------- ------------------------------------------------------
10002 01 2007-02-10 00:00:00.000
10006 02 2007-03-02 00:00:00.000
10001 03 2007-03-01 00:00:00.000
10005 03 2007-02-22 00:00:00.000
10005 03 2007-03-02 00:00:00.000

(所影响的行数为 5 行)

[解决办法]
没有什么难的 就是你的显示方法重写了 第二次的那个显示方法 把你or前面的判断给重写了
你把最后的> =变成 <=可能会更好理解
[解决办法]

我把楼主代码原封不动放到查询分析器里.
执行后结果是完全一样的,并没有出现楼主的情况,怎么回事?


[解决办法]
你的什么SQL呀,我的查出来就一样
[解决办法]
在SP3,SP4下测试,查询结果安全一样。

热点排行