恳求一个字符串关联数据表的SQL查询语句!!!!

时间:2020-11-28 21:00:41
有一个字符串string=('name1','name2','name3')
还有一张数据表,格式如下:

ID  |  NAME  |   LEVEL  |   DATE
---------------------------------------
1     name1      1          2005-6-8 15:39:20
2     name2      3          2005-6-7 15:39:20
4     name1      4          2005-6-5 15:39:20
6     name3      2          2005-6-9 15:39:20
7     name3      2          2005-6-8 15:45:20
8     name4      4          2005-6-9 15:45:20
........



现在要求在字符串中所有的name下的level最大的详细记录,示例如下:

ID  |  NAME  |   LEVEL  |   DATE
---------------------------------------
2     name2      3          2005-6-7 15:39:20
4     name1      4          2005-6-5 15:39:20
6     name3      2          2005-6-9 15:39:20

即:1》name要显示所有字符串中的,其他的不显示
    2》结果中的其他详细字段值为表中符合条件的level最大值的所在行

8 个解决方案

#1


还有一个条件:

3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行

#2


'name1','name2','name3'生成一个表变量,然后用这个表变量与数据表关联查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。

#3


还是不大明白你说的意思,并不需要找最大的ID,
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!

谁能给个sql语句示例啊??

#4


--测试表及数据
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union 
select 4,'name1',4,'2005-6-5 15:39:20' union 
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'

--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000

*/

#5


执行有错误啊

#6



create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union 
select 4,'name1',4,'2005-6-5 15:39:20' union 
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'

select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)
And A.DATE = (select max(DATE) from #t where NAME=a.NAME)

Drop Table  #t

#7


Select *
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from  (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C  
where C.NAME=B.NAME)
Order By Id

#8


jzdmyjzd(晓明) ,谢谢,你的sql经过测试是正确的。
我已经通过转换并添加一些其他条件后使用了,再次感谢。

BTW:你的名字和我的是一样的。:)

#1


还有一个条件:

3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行

#2


'name1','name2','name3'生成一个表变量,然后用这个表变量与数据表关联查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。

#3


还是不大明白你说的意思,并不需要找最大的ID,
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!

谁能给个sql语句示例啊??

#4


--测试表及数据
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union 
select 4,'name1',4,'2005-6-5 15:39:20' union 
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'

--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000

*/

#5


执行有错误啊

#6



create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union 
select 4,'name1',4,'2005-6-5 15:39:20' union 
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'

select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)
And A.DATE = (select max(DATE) from #t where NAME=a.NAME)

Drop Table  #t

#7


Select *
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from  (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C  
where C.NAME=B.NAME)
Order By Id

#8


jzdmyjzd(晓明) ,谢谢,你的sql经过测试是正确的。
我已经通过转换并添加一些其他条件后使用了,再次感谢。

BTW:你的名字和我的是一样的。:)