高分求一条Sql语句
表A内容如下
aaa
bbb
表B内容如下:
aaa ccc1 2006
aaa ccc2 2005
bbb ddd1 2006
bbb ddd2 2005
要求结果如下:
aaa ccc1
bbb ddd1
根据表B的时间倒序出来,取时间最近的一条
问题点数:100、回复次数:38Top
1 楼savagewang1978(遛鎏)回复于 2006-06-28 19:28:53 得分 0
数据库不支持Top(补充一下)Top
2 楼azsoft(Try my best)回复于 2006-06-28 19:36:54 得分 0
select a, b from 表B where rq=(select max(rq) from 表B) group by rqTop
3 楼azsoft(Try my best)回复于 2006-06-28 19:41:42 得分 0
select o.a,o.b from 表a inner join (select a,b from 表B where rq=(select max(rq) from 表B) group by a ) as o on 表a.a=o.aTop
4 楼LouisXIV(夜游神)回复于 2006-06-28 19:45:04 得分 0
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
select *
from @b a
where 1>(select count(1) from @b where a.col1=col1 and col3>a.col3)
/*
col1 col2 col3
---- ---- -----------
aaa ccc1 2006
bbb ddd1 2006
*/Top
5 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:03:46 得分 0
a表沒看到作用,借用LouisXIV(夜游神)的數據
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
Select col1,col2 From @b B Where col3=(Select Max(col3) From @b Where col1=B.col1) Order By col1
--Result
/*
col1 col2
aaa ccc1
bbb ddd1
*/
Top
6 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:06:52 得分 0
azsoft(Try my best) 的兩條語句都是錯誤的。Top
7 楼xh308(xiaohu)回复于 2006-06-28 20:07:26 得分 0
设表A 的列名:code
表B的列名:code,name,time
用下述语句:
SELECT code, name
FROM 表2
WHERE code in(select code from 表1) and
time in(select max(time) from 表2 group by code);Top
8 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:10:05 得分 0
樓上的語句是錯誤的。
假如我去掉一條數據
aaa ccc1 2006
看看會得到怎樣的結果。Top
9 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:12:21 得分 0
如果要加上a表的話
declare @a table
(
col1 char(3)
)
insert into @a
select 'aaa' union all
select 'bbb'
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
Select A.col1,B.col2 From @a A Inner Join @b B
On A.col1=B.col1
Where B.col3=(Select Max(col3) From @b Where col1=B.col1)
Order By A.col1
--Result
/*
col1 col2
aaa ccc1
bbb ddd1
*/Top
10 楼xh308(xiaohu)回复于 2006-06-28 20:15:39 得分 0
设表A 的列名:code
表B 的列名:code,name,time
用下述语句:
SELECT code, name
FROM 表B
WHERE code in(select code from 表A) and
time in(select max(time) from 表B group by code)
order by code;Top
11 楼fcuandy(了此残生.)回复于 2006-06-28 20:17:57 得分 0
我把那段话又发这了:
虽然楼主很有诚意的列出了示例数据.我还是看不出楼主要干什么。
是取表B第一字段相同的记录中第三字段值最大(虽然我的第六感也非常认为是这样,但严谨的思维告诉我一定要问清楚^^)的记录,还是取第三字段为”2006”的记录?
上面都写那么多条语句了,我没得写了,无聊,随便发发.
写法有很多种,但第一字段值相同的第三字段最大值也有几个相同的话,想不通楼主要什么结果.哈哈.
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'aaa','ccc3',2006 union all
select 'bbb','ddd2',2005
aaa你是要选ccc1还是ccc3
又不能用TOP,没有标识列,没法区分,你想取ccc3也行,想取ccc1也行,反正无法区分,你随便取一条都可以说它是第一条也可以说它是最后一条啦.哈哈Top
12 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:18:08 得分 0
都說了,你的語句有問題的,不是所有的code 的maxtime都一樣。Top
13 楼fcuandy(了此残生.)回复于 2006-06-28 20:20:05 得分 0
即便用IDENTITY插入临时表,呵呵,虽然能跟具标识列选出是用CCC1还是CCC3, 但在实际应用中说明不了问题.Top
14 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:20:09 得分 0
fcuandy(要学的东西还很多) ,樓主貼出這樣的需求,應該就有一定的原因的。
假如相同的col1 ,col3不會重復,就不會有任何問題,不要總是往複雜的方向想。Top
15 楼azsoft(Try my best)回复于 2006-06-28 20:23:35 得分 0
承认错误,没有测试。
以下是测试成功
declare @a table
(
col1 char(3)
)
insert into @a
select 'aaa' union all
select 'bbb'
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
select o.*
from @a c
inner join (select col1,col2,col3
from @b b
where col3=(select max(col3) from @b a where a.col1=b.col1 group by col1)) as o
on o.col1=c.col1
--结果
aaa ccc1 2006
bbb ddd1 2006
Top
16 楼fcuandy(了此残生.)回复于 2006-06-28 20:24:07 得分 0
col1肯定重复,不然何必用MAX 取col3. 至于col3有没有重复值就不清楚啦,这要看楼主了.呵呵.
Top
17 楼azsoft(Try my best)回复于 2006-06-28 20:26:19 得分 0
楼主的意思:
可能是用 a表作为主表外连接b表
Top
18 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-28 20:28:35 得分 0
fcuandy(要学的东西还很多) ( ) 信誉:100 2006-06-28 20:24:00 得分: 0
col1肯定重复,不然何必用MAX 取col3. 至于col3有没有重复值就不清楚啦,这要看楼主了.呵呵.
---------------------------
我是說col1和col3的組合不會重復,假如是這樣的,你所說的情況就不存在了。
不需要所有的問題都考慮的那麼複雜的。
Top
19 楼azsoft(Try my best)回复于 2006-06-28 20:29:18 得分 0
fcuandy(要学的东西还很多): 说得不无道理,如果col3也有重复 就要用到IDENTITY 取值了Top
20 楼losedxyz(我真的一无所有)回复于 2006-06-28 20:31:46 得分 0
select a, b from 表B where rq=(select max(rq) from 表B) group by rq
Top
21 楼fcuandy(了此残生.)回复于 2006-06-28 20:31:51 得分 0
这全是让人猜,
tbA中的col跟
tbB中的col1 group出来的
一模一样,还有我上面说的那个猜测(还是取第三字段为”2006”的记录),尽管可能性能很小,但都要想.
比如实际上他的tbA中可能是 aaa bbb ccc这样的记录呢.
这时的要求就是col1以tbB为准
或者
比如实际上他的tbB中还有可能一箱 ccc cccN 2007的记录呢?
这时的要求就是col1以tbA为准
又或者
他表A中col1有 ccc,
表B中col1有 ddd
这时他要求的是两表col1的交集呢?
不能说他示例数据有问题,至少数据有冗佘,几条示例数据刚好又...Top
22 楼azsoft(Try my best)回复于 2006-06-28 20:36:57 得分 0
fcuandy(要学的东西还很多) :有点远了。
楼主呢?出来澄清一下,哈哈。。。
Top
23 楼fcuandy(了此残生.)回复于 2006-06-28 20:40:51 得分 0
今晚有点无聊.呵呵,不好意思.Top
24 楼savagewang1978(遛鎏)回复于 2006-06-28 21:46:21 得分 0
楼上的都不错,真是感激不尽,给了我很多启发,谢谢大家了Top
25 楼xiaoxiangqing(肖祥清)回复于 2006-06-29 09:22:27 得分 0
if exists(select 1 from sysobjects where object_id('A')=id and type='u')
drop table A
if exists(select 1 from sysobjects where object_id('B')=id and type='u')
drop table B
go
create table A(bh varchar(20) not null)
create table B(bh varchar(20) not null,content varchar(20) not null,year int not null)
go
insert A
select 'aaa' union all
select 'bbb'
insert B
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
go
select * from A
/*
bh
aaa
bbb
*/
select * from B
/*
bh content year
aaa ccc1 2006
aaa ccc2 2005
bbb ddd1 2006
bbb ddd2 2005
*/
select a.bh,b.content from A join B on a.bh=b.bh join (select bh,max(year) year from B group by bh)c on b.bh=c.bh and b.year=c.year order by 1
/*
bh content
aaa ccc1
bbb ddd1
*/
Top
26 楼ls0611(allan)回复于 2006-06-29 09:40:25 得分 0
借上面楼主的代码:
declare @a table
(
col1 char(3)
)
insert into @a
select 'aaa' union all
select 'bbb'
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
select a.col1,min(a.col2) as col2 from @b a
where a.col1 in (select col1 from @a)
group by a.col1Top
27 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-29 09:52:18 得分 0
ls0611(allan) ,你的結果是對的,但是你的語句完全不符合樓主的邏輯的。Top
28 楼ls0611(allan)回复于 2006-06-29 10:05:22 得分 0
不好意思,没仔细看。Top
29 楼ls0611(allan)回复于 2006-06-29 10:18:57 得分 0
declare @a table
(
col1 char(3)
)
insert into @a
select 'aaa' union all
select 'bbb'
declare @b table
(
col1 char(3),
col2 char(4),
col3 int
)
insert into @b
select 'aaa','ccc1',2006 union all
select 'aaa','ccc2',2005 union all
select 'bbb','ddd1',2006 union all
select 'bbb','ddd2',2005
select a.col1,a.col2 from @b a
left join (select col1,max(col1+cast(col3 as char(6))) as tt from @b group by col1)b on
a.col1=b.col1
where a.col1 in (select col1 from @a) and a.col1+cast(a.col3 as char(6))=b.tt
仅供参考!Top
30 楼wcj86009(不懂就问)回复于 2006-06-29 10:39:46 得分 0
学习Top
31 楼kaka009(卡卡007)回复于 2006-06-29 10:41:07 得分 0
create table A
(
stu varchar (3)
)
go
create table B
(
stu varchar (3),
mm varchar (4),
dd int ,
)
insert into A(stu) values('aaa')
insert into A(stu) values('bbb')
insert into B(stu,mm,dd) values ('aaa','ccc2',2005)
insert into B(stu,mm,dd) values ('bbb','ddd1',2006)
insert into B(stu,mm,dd) values ('bbb','ddd2',2005)
insert into B(stu,mm,dd) values ('aaa','ccc1',2006)
select B.stu ,B.mm from B left join A on B.stu=A.stu where dd=2006 order by mm asc
Top
32 楼swallowjiang(swallow)回复于 2006-06-29 11:04:42 得分 0
表A内容如下
colum1
aaa
bbb
表B内容如下:
colum1 colum2 colum3
aaa ccc1 2006
aaa ccc2 2005
bbb ddd1 2006
bbb ddd2 2005
要求结果如下:
aaa ccc1
bbb ddd1
select colum1,max(colum3) into #tmp1 from Bgroup by colum1
select B.colum1,B.colum2 from B where colum1 in ( select colum1 from A)
Top
33 楼swallowjiang(swallow)回复于 2006-06-29 11:06:21 得分 0
樓上的后兩句是我寫的SQLTop
34 楼hurricane74()回复于 2006-06-29 13:46:21 得分 0
晕了,看不明白Top
35 楼ych3000()回复于 2006-06-29 15:02:14 得分 0
create table A
(
stu varchar (3)
)
go
create table B
(
stu varchar (3),
mm varchar (4),
dd int ,
)
insert into A(stu) values('aaa')
insert into A(stu) values('bbb')
insert into B(stu,mm,dd) values ('aaa','ccc2',2005)
insert into B(stu,mm,dd) values ('bbb','ddd1',2006)
insert into B(stu,mm,dd) values ('bbb','ddd2',2005)
insert into B(stu,mm,dd) values ('aaa','ccc1',2006)
select * from a
select * from b
select a.stu,b.mm from a left outer join b on a.stu = b.stu where dd=2006 order by mm asc
Top
36 楼FollowIT(每天进步一点)回复于 2006-06-29 16:35:52 得分 0
已经测试通过:
create table #tmp_a(
data_field_1 varchar(10)
)
create table #tmp_b(
data_field_1 varchar(10),
data_field_2 varchar(10),
data_field_3 varchar(20)
)
insert into #tmp_a values ('aaa')
insert into #tmp_a values ('bbb')
insert into #tmp_b values ('aaa','ccc1','2006')
insert into #tmp_b values ('aaa','ccc2','2005')
insert into #tmp_b values ('bbb','ddd1','2006')
insert into #tmp_b values ('bbb','ddd2','2005')
select #tmp_a.data_field_1,#tmp_b.data_field_2 from #tmp_a,#tmp_b
where #tmp_a.data_field_1 = #tmp_b.data_field_1
and #tmp_b.data_field_3 in (select max(t.data_field_3) from #tmp_b,#tmp_b t where #tmp_b.data_field_1 = t.data_field_1)
order by #tmp_b.data_field_3 desc
drop table #tmp_a
drop table #tmp_b
result:
aaa ccc1
bbb ddd1Top
37 楼zjdyzwx(十一月猪)回复于 2006-06-29 20:07:12 得分 0
select a.col1 , a.col2
from tab a
where not exists (select 1 from tab b where a.col1 = b.col1 and a.col3 < b.col3)
or
select a.col1 , a.col2
from tab a
where col3 = (select max(col3) from tab b where a.col1 = b.col1)
Top
38 楼alps014(聆听)回复于 2006-06-29 21:45:56 得分 0
表A内容如下
colum1
aaa
bbb
表B内容如下:
colum1 colum2 colum3
aaa ccc1 2006
aaa ccc2 2005
bbb ddd1 2006
bbb ddd2 2005
要求结果如下:
aaa ccc1
bbb ddd1
select colum1,max(colum3) into #tmp1 from Bgroup by colum1
select B.colum1,B.colum2 from B where colum1 in ( select colum1 from A)
Top




