急!急!单表查询问题!在线等

hahahyOo 2008-11-07 11:15:25
id email address lastdate
id email 地址 最后更新时间
int nvarchar int(0/1) datetime

1:地址:0备用地址  1默认地址   
2:没有默认地址,最后更新时间设为默认地址
3:只有一条记录,取这一条
4:取得多条记录,取最后更新时间
5:id为指定id

先谢谢!
...全文
120 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahahyOo 2008-11-07
  • 打赏
  • 举报
回复
问题解决:
非常谢谢各位的解答
szx1999
wufeng4552
fcuandy
...


Herb2 2008-11-07
  • 打赏
  • 举报
回复
select id,mail,case when max(lastdate) is null then 1 else address end,max(lastdate) from tb where id = @id
group by id,mail,address
等不到来世 2008-11-07
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[email] varchar(10),[address] int,[lastdate] varchar(20))
insert [tb]
select 1,'a@a.a',0,'2008-05-05' union all
select 2,'a@a.a',0,'2008-05-07' union all
select 3,'b@b.b',0,'2008-05-05' union all
select 4,'b@b.b',1,'2008-05-08' union all
select 5,'c@c.c',0,'2008-05-05'

--select * from [tb]

declare @email varchar(10)
set @email='a@a.a'
--set @email='b@b.b'
--set @email='c@c.c'

select top 1 email,address,lastdate
from tb
where email=@email
order by address desc,lastdate desc


--测试结果:
/*
email address lastdate
---------- ----------- --------------------
a@a.a 0 2008-05-07

(1 row(s) affected)
*/
水族杰纶 2008-11-07
  • 打赏
  • 举报
回复
DECLARE @T TABLE (id INT,    email VARCHAR(10) ,   address INT,      lastdate VARCHAR(10)) 
INSERT @T SELECT 1, 'a@a.a' , 0 , '2008-05-05'
INSERT @T SELECT 2, 'a@a.a' , 0 , '2008-05-07'
INSERT @T SELECT 3, 'b@b.b' , 0 , '2008-05-05'
INSERT @T SELECT 4, 'b@b.b' , 1, '2008-05-08'
INSERT @T SELECT 5, 'c@c.c' , 0 , '2008-05-05'
IF NOT EXISTS(SELECT 1 FROM @T WHERE email='a@a.a' and address=1 )
select top 1 * from @t order by lastdate desc
IF EXISTS(SELECT 1 FROM @T WHERE email='c@c.c' and address=1 )
select * FROM @T WHERE email='c@c.c' and address=1
ELSE IF (SELECT COUNT(*) FROM @T WHERE email='c@c.c')=1
select * FROM @T WHERE email='c@c.c'
/*id email address lastdate
----------- ---------- ----------- ----------
4 b@b.b 1 2008-05-08

id email address lastdate
----------- ---------- ----------- ----------
5 c@c.c 0 2008-05-05
*/
hahahyOo 2008-11-07
  • 打赏
  • 举报
回复
非常感谢 fcuandy
我先看看.呵
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
--sql2000. 又成了同组选一个的问题 了,组合写法太多,不一一写了。

DECLARE @t TABLE(id INT,email NVARCHAR(100),address INT CHECK(address IN(0,1) /*并且程序逻辑上控制一个人只能有一个默认地址*/),lastDate DATETIME)
INSERT @t SELECT 1,'fcuandy@111.com',0,GETDATE()
UNION ALL SELECT 1,'fcuandy@122.com',1,DATEADD(mm,-1,GETDATE())
UNION ALL SELECT 2,'roy@xx.com',0,GETDATE()
UNION ALL SELECT 2,'roy@yy.com',0,'2008-1-1'
UNION ALL SELECT 3,'haiwer@vv.com',0,GETDATE()

SELECT id,email,lastDate FROM @t a
WHERE NOT EXISTS(SELECT 1 FROM @t WHERE id=a.id AND CASE WHEN address=1 THEN '9999-1-1' ELSE lastDate END > CASE WHEN a.address=1 THEN '9999-1-1' ELSE a.lastDate END)
/*
1 fcuandy@122.com 1 2008-10-07 11:42:54.437
2 roy@xx.com 0 2008-11-07 11:42:54.437
3 haiwer@vv.com 0 2008-11-07 11:42:54.437
*/

SELECT a.* FROM @t a
INNER JOIN
(SELECT id,MAX(CASE WHEN address=1 THEN '9999-1-1' ELSE lastDate END) md FROM @t GROUP BY id) b
ON a.id=b.id AND md=CASE WHEN address=1 THEN '9999-1-1' ELSE lastDate END
/*
1 fcuandy@122.com 2008-10-07 11:39:04.543
2 roy@xx.com 2008-11-07 11:39:04.543
3 haiwer@vv.com 2008-11-07 11:39:04.543
*/
hahahyOo 2008-11-07
  • 打赏
  • 举报
回复
表达不好..莫怪
fcuandy 2008-11-07
  • 打赏
  • 举报
回复
DECLARE @t TABLE(id INT,email NVARCHAR(100),address INT CHECK(address IN(0,1) /*并且程序逻辑上控制一个人只能有一个默认地址*/),lastDate DATETIME)
INSERT @t SELECT 1,'fcuandy@111.com',0,GETDATE()
UNION ALL SELECT 1,'fcuandy@122.com',1,DATEADD(mm,-1,GETDATE())
UNION ALL SELECT 2,'roy@xx.com',0,GETDATE()
UNION ALL SELECT 2,'roy@yy.com',0,'2008-1-1'
UNION ALL SELECT 3,'haiwer@vv.com',0,GETDATE()
;WITH fc
AS
(
SELECT id,email,CASE WHEN address=1 THEN '9999-1-1' ELSE lastDate END theDay,lastDate FROM @t
)
SELECT id,email,lastDate FROM fc a
WHERE NOT EXISTS(SELECT 1 FROM fc WHERE id=a.id AND theDay > a.theDay)
/*
1 fcuandy@122.com 2008-10-07 11:39:04.543
2 roy@xx.com 2008-11-07 11:39:04.543
3 haiwer@vv.com 2008-11-07 11:39:04.543
*/
hahahyOo 2008-11-07
  • 打赏
  • 举报
回复
更正:根据email 查询
id email address lastdate
1 a@a.a 0 2008-05-05
2 a@a.a 0 2008-05-07
3 b@b.b 0 2008-05-05
4 b@b.b 1 2008-05-08
5 c@c.c 0 2008-05-05
______________________________

查a@a.a的数据:
第一种情况:
1.没有address为1 数据 那么 我就取lastdate 为最大的
结果就是
a@a.a 0 2008-05-07

第二种情况:
查c@c.c的数据
1.有address 为1 那么就取这条数据
b@b.b 1 2008-05-08

第三种情况:
查c@c.c的数据:
1.如果只有一条,那我就取这条.
结果就是:

c@c.c 0 2008-05-05


等不到来世 2008-11-07
  • 打赏
  • 举报
回复
declare @id int
set @id=100

select top 1 id,email,address,lastdate
from tb
where id=@id
order by lastdate desc
chenjunsheep 2008-11-07
  • 打赏
  • 举报
回复
什么意思,我MS来到了火星..
水族杰纶 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 hahahyOo 的帖子:]
id email address lastdate
id email 地址 最后更新时间
int nvarchar int(0/1) datetime

1:地址:0备用地址  1默认地址   
2:没有默认地址,最后更新时间设为默认地址
3:只有一条记录,取这一条
4:取得多条记录,取最后更新时间
5:id为指定id

先谢谢!
[/Quote]
看的暈暈的
貼數據及結果~~
hahahyOo 2008-11-07
  • 打赏
  • 举报
回复
没人么?
自己顶啊

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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