SQL查询问题

Hotus 2011-02-09 06:24:53
SELECT A.*
FROM A
WHERE (State = 0) AND (NOT EXISTS
(SELECT 1
FROM B
WHERE A.I = B.I AND B.username = 'AAA' AND
datediff(day, B.update2, '2011-02-09') > 30))
ORDER BY ID DESC

为什么无效呢?
去掉AND datediff(day, B.update2, '2011-02-09') > 30 这个结果就正确,加上就不正确
表a里面 也有update2
...全文
83 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linares 2011-02-09
  • 打赏
  • 举报
回复
not exists <

双重否定
Hotus 2011-02-09
  • 打赏
  • 举报
回复
谢谢,可以了,是什么问题呢?
Linares 2011-02-09
  • 打赏
  • 举报
回复
--> 测试数据:#a
if object_id('tempdb.dbo.#a') is not null drop table #a
create table #a(I int, State int)
insert into #a
select 1, 0 union all
select 2, 0 union all
select 3, 0 union all
select 4, 0
--> 测试数据:#b
if object_id('tempdb.dbo.#b') is not null drop table #b
create table #b(I int, UserName varchar(8), Update2 datetime)
insert into #b
select 1, 'aaa', '2011-02-07 12:20:20' union all
select 2, 'aaa', '2011-01-07 12:20:20'

-- exists
select * from #a t where not exists (select 1 from #b where I=t.I and datediff(day, Update2, '2011-02-09')<30)
/*
I State
----------- -----------
2 0
3 0
4 0
*/
Linares 2011-02-09
  • 打赏
  • 举报
回复
--> 测试数据:#a
if object_id('tempdb.dbo.#a') is not null drop table #a
create table #a(I int, State int)
insert into #a
select 1, 0 union all
select 2, 0 union all
select 3, 0 union all
select 4, 0
--> 测试数据:#b
if object_id('tempdb.dbo.#b') is not null drop table #b
create table #b(I int, UserName varchar(8), Update2 datetime)
insert into #b
select 1, 'aaa', '2011-02-07 12:20:20' union all
select 2, 'aaa', '2011-01-07 12:20:20'

-- exists
select * from #a t where not exists (select 1 from #b where I=t.I)
or exists (select 1 from #b where I=t.I and datediff(day, Update2, '2011-02-09') > 30)

-- left join
select a.* from #a a left join #b b on a.I=b.I
where datediff(day, isnull(b.Update2,0), '2011-02-09') > 30

/*
2
3
4
*/
Hotus 2011-02-09
  • 打赏
  • 举报
回复
2011-02-07 12:20:10 日期格式都是统一的
Hotus 2011-02-09
  • 打赏
  • 举报
回复
A表
I State
1 0
2 0
3 0
4 0

B表
I UserName Update2
1 aaa 2010-02-07 12:20:20(小于30天,不返回)
2 aaa 2010-01-07 12:20:20 (大于30天,返回)

应该返回的是 A表的
2
3
4
Linares 2011-02-09
  • 打赏
  • 举报
回复
不用看,一个是datepart,一个abbreviations
-晴天 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hotus 的回复:]
在'2011-02-09'这个之前
[/Quote]
建议给出一些数据,以及正确查询所得到的结果.
Hotus 2011-02-09
  • 打赏
  • 举报
回复
在'2011-02-09'这个之前
-晴天 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 linares 的回复:]
引用 10 楼 qianjin036a 的回复:

引用 8 楼 linares 的回复:
#4:

datediff dd / day

有什么区别?


标准与非标准.


那应该 d 更标准
[/Quote]
你去查一下联机丛书吧.
Linares 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qianjin036a 的回复:]

引用 8 楼 linares 的回复:
#4:

datediff dd / day

有什么区别?


标准与非标准.
[/Quote]

那应该 d 更标准
-晴天 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 linares 的回复:]
#4:

datediff dd / day

有什么区别?
[/Quote]

标准与非标准.
-晴天 2011-02-09
  • 打赏
  • 举报
回复
你最好给出一些数据.
Linares 2011-02-09
  • 打赏
  • 举报
回复
#4:

datediff dd / day

有什么区别?
Linares 2011-02-09
  • 打赏
  • 举报
回复
SELECT A.*
FROM A
WHERE (State = 0) AND (EXISTS
(SELECT 1
FROM B
WHERE A.I = B.I AND B.username = 'AAA' AND
datediff(day, B.update2, '2011-02-09') > 30)
)
ORDER BY ID DESC
快溜 2011-02-09
  • 打赏
  • 举报
回复

--update2在2011-02-09之前之后?
AND abs(datediff(day, B.update2, '2011-02-09')) > 30
Linares 2011-02-09
  • 打赏
  • 举报
回复
或者用 exists
-晴天 2011-02-09
  • 打赏
  • 举报
回复
AND datediff(dd, B.update2, '2011-02-09') > 30 
Linares 2011-02-09
  • 打赏
  • 举报
回复
你这个逻辑应该用 inner join
Hotus 2011-02-09
  • 打赏
  • 举报
回复
不能返回正确的结果
b 里面有数据,按照条件,应该是update2大于30天,才返回
现在就直接返回,AND datediff(day, B.update2, '2011-02-09') > 30 这个条件没起作用
去掉这个,就能返回正确的结果
(正确的结果是 如果B表里面包含了A表里面的数据,并且小于30天,就不返回,大于30天就返回)
加载更多回复(1)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧