使用 join的方式,以主資料表中的資料為主要依據,取得狀態資料表中最新一筆紀錄,並顯示狀態資料表中的各項資訊
現在有兩個資料表(TableA,TableB),TableA存放物品基本資料,TableB存放物品更新狀態
表A
TableA | ||
欄位名稱 | 資料型別 | 內容 |
ID | int | |
product | varchar | |
importDate | datetime |
裡面的資料
ID | prodcut | importDate |
1 | 物品A | 2016/4/1 |
2 | 物品B | 2016/4/1 |
3 | 物品C | 2016/4/2 |
4 | 物品D | 2016/4/3 |
資料表B
TableB | ||
欄位名稱 | 資料型別 | 內容 |
product | varchar | |
updateTime | datetime | |
updateStatus | varchar |
裡面的資料
product | updateTime | updateStatus |
物品1 | 2016/4/2 | 更新1 |
物品2 | 2016/4/2 | 更新1 |
物品1 | 2016/4/3 | 更新2 |
物品3 | 2016/4/2 | 更新1 |
物品3 | 2016/4/3 | 更新2 |
現在要取得某個product的最新一筆紀錄,相信大家都會下SQL指令:
Select MAX(updateTime) ,product From TableB Where TableB=@product
但如果現在是要一次性取得TableA每個product的最新一筆紀錄,同時要將TableA跟TableB的欄位都顯示出來(重覆的product只出現一次),這時該怎麼下?
最後取出的表呈現如下:
ID | product | importDate | updateTime | updateStatus |
1 | 物品A | 2016/4/1 | 2016/4/3 | 更新2 |
2 | 物品B | 2016/4/1 | 2016/4/2 | 更新1 |
3 | 物品C | 2016/4/2 | 2016/4/3 | 更新2 |
我的方式:
1.先取得TableB每筆的最後一筆資料
Select MAX(updateTime) ,product From TableB Group by product
2.再以上面取得的資料與TableA做inner Join
Select A.ID,A.product,A.importDate From,temp.updateTime TableA as A
inner join (Select MAX(updateTime) as updateTime,product From TableB Group by product) as temp
on A.product=temp.product
3.此時己可取得每筆的更新紀錄,但TableB的欄位只有取到updateTime,並未將updateStatus取出來,所以這時要再將TableB與步驟2取得的表再做一次inner join,並以statusTime來做關聯依據
Select A.ID,A.product,A.importDate From,temp.updateTime,B.updateStatus TableA as A
inner join (Select MAX(updateTime) as updateTime ,product From TableB Group by product) as temp
on A.product=temp.product
inner join TableB as B on B.statusTime=temp.statusTime
大功告成。