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

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

先谢谢!
...全文
71 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
没人么?
自己顶啊
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2008-11-07 11:15
社区公告
暂无公告