遇到难题了,是查询分析器的错还是我的错?
大家先不要管这两条查询语句的业务逻辑是什么,就看这两条语句为什么会返回不同的结果?
两条语句对应的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下测试,查询结果安全一样。