日期:2014-05-18  浏览次数:20567 次

关联表,取子表某个字段最小值
表一:
ID     code
1       yi
2       er
3       san
表二:
ID       PID     startTime
1         1           2007-01-03
2         1           2005-2-2
3       2               2007-1-1
======================
问题是   :
对两表关联:
取结果:
ID         code     startTime
1             yi         2005-2-2
2             er         2007-1-1


------解决方案--------------------
select a.id , a.code , min(b.starttime) starttime from a,b where a.id = b.code group by a.id , a.code
------解决方案--------------------
select a.ID , a.code , min(b.starttime) starttime from 表一 as a, 表二 as b where a.ID = b.PID group by a.ID, a.code

------解决方案--------------------
select
a.id, a.code, min(b.starttime) as starttime
from 表一 a, 表二 b
where a.id = b.pid
group by a.id, a.code
order by a.id
------解决方案--------------------
---方法1
Select
B.PID As ID,
A.Code,
B.StartTime
From
(Select PID,Min(StartTime) As StartTime From 表二 Group By PID) As B
Left Join
表一 As A
On B.Pid=A.ID
Order By B.PID
---方法2
Select
PID As ID,
(Select Code From 表一 Where ID=B.PID) As Code,
Min(StartTime) As StartTime
From
表二 As B
Group By PID
------解决方案--------------------
--原始数据:@T1
declare @T1 table(ID int,code varchar(4))
insert @T1
select 1, 'yi ' union all
select 2, 'er ' union all
select 3, 'san '
--原始数据:@T2
declare @T2 table(ID int,PID int,startTime datetime)
insert @T2
select 1,1, '2007-01-03 ' union all
select 2,1, '2005-2-2 ' union all
select 3,2, '2007-1-1 '

--取最小:这个符合题目要求
select a.*,startTime=min(b.startTime) from @T1 a join @T2 b on a.ID=b.PID group by a.ID,a.code order by a.ID

--取最大
select a.*,startTime=max(b.startTime) from @T1 a join @T2 b on a.ID=b.PID group by a.ID,a.code order by a.ID

--取最小:这个符合题目要求
select a.*,b.startTime from @T1 a join @T2 b on a.ID=b.PID where b.startTime=(select min(startTime) from @T2 where PID=b.PID) order by a.ID

--取最大
select a.*,b.startTime from @T1 a join @T2 b on a.ID=b.PID where b.startTime=(select max(startTime) from @T2 where PID=b.PID) order by a.ID

--取随机
select a.*,b.startTime from @T1 a join @T2 b on a.ID=b.PID where b.startTime=(select top 1 startTime from @T2 where PID=b.PID order by newid()) order by a.ID

------解决方案--------------------
declare @a table(id int identity(1,1),code varchar(20))
insert @a
select 'yi '
union all
select 'er '
union all
select 'san '

declare @b table(id int identity(1,1),pid int,starttime datetime)
insert @b
select 1, '2007-01-03 '
union all
select 1, '2005-2-2 '
union all
select 2, '2007-1-1 '

select c.id,c.code,d.starttime from @a c,