日期:2014-05-19  浏览次数:20515 次

这样的主从表查询语句如何编写?

现有两个主从明细表,表结构如下:
table1:
MasterID         Name
1       aaa
2       bbb
3       ccc
-------------------------------------------
table2:
ID MasterID                   State CreatedDate
1 2 开始 2007-6-6
2 2 执行中 2007-6-8
3 2 完成 2007-6-10
4 3 开始 2007-6-7
5 3 执行中 2007-6-9
--------------------------------------------
现在想得到如下的查询结果:
MasterID                   Name Laststate     LastDate
1 aaa 未开始
2 bbb 完成 2007-6-10
3 ccc 执行中 2007-6-9
---------------------------------------------
也就是说如果从表(table2)中,没有从记录,则Laststate字段就显示“未开始”,LastDate留空。如果有从记录的,就只把最后时间的记录与主表(table1)合并。
这样的查询语句如何编写?谢谢!

------解决方案--------------------
select
a.MasterID,
a.Name,
isnull(b.State, '未开始 ') as LastState,
b.CreatedDate as LastDate
from
table1 a
left join
table2 b
on
a.MasterID=b.MasterID
and
not exists(select 1 from table2 where MasterID=b.MasterID and CreatedDate> b.CreatedDate)
------解决方案--------------------
Select a.MasterID,a.Name,IsNULL(b.State, '为开始 '),b.CreatedDate as LastDate
from table1 as a Left Join table2 as b on a.MasterID=b.MasterID
and not exists(Select * from table2
where MasterID=b.MasterID and CreatedDate> b.CreatedDate)
------解决方案--------------------
Select
A.*,
(Case When D.MasterID Is Null Then N '未开始 ' Else D.State End) As Laststate,
(Case When D.MasterID Is Null Then Null Else D.CreatedDate End) As LastDate
From
table1 A
Left Join
(Select B.* From table2 B Inner Join (Select MasterID, Max(CreatedDate) As CreatedDate From table2 Group By MasterID) C On B.MasterID = C.MasterID And B.CreatedDate = C.CreatedDate) D
On A.MasterID = D.MasterID

------解决方案--------------------
--方法一
Select
A.*,
(Case When D.MasterID Is Null Then N '未开始 ' Else D.State End) As Laststate,
(Case When D.MasterID Is Null Then Null Else D.CreatedDate End) As LastDate
From
table1 A
Left Join
(Select B.* From table2 B Inner Join (Select MasterID, Max(CreatedDate) As CreatedDate From table2 Group By MasterID) C On B.MasterID = C.MasterID And B.CreatedDate = C.CreatedDate) D
On A.MasterID = D.MasterID

--方法二
Select
A.*,
(Case When D.MasterID Is Null Then N '未开始 ' Else D.State End) As Laststate,
(Case When D.MasterID Is Null Then Null Else D.CreatedDate End) As LastDate
From
table1 A
Left Join
(Select B.* From table2 B Where Not Exists(Select MasterID From table2 Where MasterID = B.MasterID And CreatedDate > B.CreatedDate)) D
On A.MasterID = D.MasterID


--方法三
Select
A.*,
(Case When D.MasterID Is Null Then N '未开始 ' Else D.State End) As Laststate,
(Case When D.MasterID Is Null Then Null Else D.CreatedDate End) As LastDate
From
table1 A
Left Join
(Select B.* From table2 B Where CreatedDate = (Select Max(CreatedDate) From table2 Where MasterID = B.MasterID)) D
On A.MasterID = D.MasterID
------解决方案--------------------
select table1.MasterID ,Name,(case when table2.State is null then N '未开始 ' else table2.State end ) as Laststate ,