***access sql查询的棘手问题(以多个同类型字段的最大值作为查询条件!)

时间:2022-03-20 15:33:04
我的数据库比如是这样:
字段:...  date1,date2,date3...

我的目的是,以date1~date3(可能实际还不止这三个,在此只列举三个以说明我的意思)日期型字段的 每条记录的最大值是否介于t1和t2(asp中的日期型变量)之间,来作为我的主要select查询语句的其中 某一个条件。如何写该查询语句?
请注意上面的红色字体,希望你们不要误解我的本意。也就是说,肯定不能用max()之类的函数,那样的话,是将某个字段(比如date1)的所有记录的最大值取出,而我的要求是求出每个记录的三个字段的最大值,以此作为查询条件(也就是放在where中),来进行下一步的操作。
不知道高手明白我的意思否?盼指教!
(若满意可追加分数)

8 个解决方案

#1


还有,千万不要通过建立临时表的方式。代码尽量简单,实在不行可以采用嵌套查询。

#2


--------------------------------------------------------------
下面只是测试 


create table tt(aa int,a datetime,b datetime,c datetime)
insert into tt
select 1,'2008-09-01','2008-09-22','2008-10-22' union all
select 2,'2008-10-01','2008-09-22','2008-11-22' union all
select 3,'2008-12-01','2008-09-22','2008-06-22' union all
select 4,'2008-10-01','2008-12-22','2008-11-22' 

 
select aa,case when (case when a>b then a else b end)>c then (case when a>b then a else b end) else c end from tt


drop table tt

#3


if object_id('tempdb..#')is not null drop table #
go
create table #(Id int ,date1 datetime,date2 datetime,date3 datetime)
insert # select 1,'2008-01-01','2008-03-01','2008-01-03'
insert # select 2,'2008-08-01','2008-10-01','2008-06-03'
insert # select 3,'2008-01-10','2008-03-01','2008-11-03'
select id ,max(date)maxdate from (
select id, date1 date  from #
union all 
select id, date2 from #
union all
select id, date3 from #  )t group by id
/*id          maxdate                                                
----------- ------------------------------------------------------ 
1           2008-03-01 00:00:00.000
2           2008-10-01 00:00:00.000
3           2008-11-03 00:00:00.000
*/

#4


怎么还是通过建立临时表啊?我不想这种方式的。难道就没有直接的办法了吗?

#5


引用 4 楼 lizhilin2008 的回复:
怎么还是通过建立临时表啊?我不想这种方式的。难道就没有直接的办法了吗?

没用临时表,只是用临时表建立测试数据

#6


水族杰綸的代码我看了半天终于指导怎么回事。但是和我的意图还有距离。你这样只是生成了以id和每行最大时间字段为字段的查询结果,而不是我要的“以此查询结果为搜索条件”的查询结果!请继续指导。
====
可能我的水平有限,不要见笑^_^

#7


"水族杰綸"你好,不好意思还是想请教你,你的代码还是不错的,但是我的水平较差,运行不起来,你的最关键的句子格式上好像和我的系统不一样啊

select id ,max(date)maxdate from (
select id, date1 date  from #
union all 
select id, date2 from #
union all
select id, date3 from #  )t group by id
=========================
我现在用的是asp+access数据库。我已经按照你说的,手工建立了一个测试表。
上面代码中max(date)maxdate 紧挨着,是不是 as maxdate的意思(这样的话就可以省略掉了)?date1 date也是一样;但是最后的...from # )t   的t是什么意思啊?
不要笑话我,我为这个问题苦恼了好长时间。按照我的猜想,在asp下,是不是应该这么写?
select id ,max(date)maxdate from (
select id, date1   from #
union all 
select id, date2 from #
union all
select id, date3 from #  ) group by id
=========
另外,在dreamweaver下,肯定形式上也得写成一行啊(或者通过_连接。中间好像还应该有括号吧。总之,我现在一头雾水。
希望加以指正,别的高手也希望来帮我一下,万分感谢。我希望修改好后能在asp+access下运行通过,就ok了!

#8


呵呵,以子查询结果作为一个表必须命名的,像t就代表
select id, date1 date  from # 
union all 
select id, date2 from # 
union all 
select id, date3 from #
这个子查询结果。
实际变成这句话了: 
select id ,max(date)  maxdate from t group by id 

max(date) maxdate ,是 as maxdate的意思 
别名有三种写法以此为例:maxdate=max(date)或者 max(date)  maxdate 或者max(date) as maxdate 

#1


还有,千万不要通过建立临时表的方式。代码尽量简单,实在不行可以采用嵌套查询。

#2


--------------------------------------------------------------
下面只是测试 


create table tt(aa int,a datetime,b datetime,c datetime)
insert into tt
select 1,'2008-09-01','2008-09-22','2008-10-22' union all
select 2,'2008-10-01','2008-09-22','2008-11-22' union all
select 3,'2008-12-01','2008-09-22','2008-06-22' union all
select 4,'2008-10-01','2008-12-22','2008-11-22' 

 
select aa,case when (case when a>b then a else b end)>c then (case when a>b then a else b end) else c end from tt


drop table tt

#3


if object_id('tempdb..#')is not null drop table #
go
create table #(Id int ,date1 datetime,date2 datetime,date3 datetime)
insert # select 1,'2008-01-01','2008-03-01','2008-01-03'
insert # select 2,'2008-08-01','2008-10-01','2008-06-03'
insert # select 3,'2008-01-10','2008-03-01','2008-11-03'
select id ,max(date)maxdate from (
select id, date1 date  from #
union all 
select id, date2 from #
union all
select id, date3 from #  )t group by id
/*id          maxdate                                                
----------- ------------------------------------------------------ 
1           2008-03-01 00:00:00.000
2           2008-10-01 00:00:00.000
3           2008-11-03 00:00:00.000
*/

#4


怎么还是通过建立临时表啊?我不想这种方式的。难道就没有直接的办法了吗?

#5


引用 4 楼 lizhilin2008 的回复:
怎么还是通过建立临时表啊?我不想这种方式的。难道就没有直接的办法了吗?

没用临时表,只是用临时表建立测试数据

#6


水族杰綸的代码我看了半天终于指导怎么回事。但是和我的意图还有距离。你这样只是生成了以id和每行最大时间字段为字段的查询结果,而不是我要的“以此查询结果为搜索条件”的查询结果!请继续指导。
====
可能我的水平有限,不要见笑^_^

#7


"水族杰綸"你好,不好意思还是想请教你,你的代码还是不错的,但是我的水平较差,运行不起来,你的最关键的句子格式上好像和我的系统不一样啊

select id ,max(date)maxdate from (
select id, date1 date  from #
union all 
select id, date2 from #
union all
select id, date3 from #  )t group by id
=========================
我现在用的是asp+access数据库。我已经按照你说的,手工建立了一个测试表。
上面代码中max(date)maxdate 紧挨着,是不是 as maxdate的意思(这样的话就可以省略掉了)?date1 date也是一样;但是最后的...from # )t   的t是什么意思啊?
不要笑话我,我为这个问题苦恼了好长时间。按照我的猜想,在asp下,是不是应该这么写?
select id ,max(date)maxdate from (
select id, date1   from #
union all 
select id, date2 from #
union all
select id, date3 from #  ) group by id
=========
另外,在dreamweaver下,肯定形式上也得写成一行啊(或者通过_连接。中间好像还应该有括号吧。总之,我现在一头雾水。
希望加以指正,别的高手也希望来帮我一下,万分感谢。我希望修改好后能在asp+access下运行通过,就ok了!

#8


呵呵,以子查询结果作为一个表必须命名的,像t就代表
select id, date1 date  from # 
union all 
select id, date2 from # 
union all 
select id, date3 from #
这个子查询结果。
实际变成这句话了: 
select id ,max(date)  maxdate from t group by id 

max(date) maxdate ,是 as maxdate的意思 
别名有三种写法以此为例:maxdate=max(date)或者 max(date)  maxdate 或者max(date) as maxdate