台灣最大程式設計社群網站
線上人數
990
 
會員總數:244584
討論主題:188715
歡迎您免費加入會員
討論區列表 >> MS SQL >> 主table 只串 子table 第一筆
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
主table 只串 子table 第一筆
價值 : 50 QP  點閱數:186 回應數:9

樓主

MStone Lin
門外漢
0 79
1604 110
發送站內信

請問
我有主table :travelapp
子table:travelapp_line

travelapp 的內容為

filneo a b c d
1080501 23 56 78 90
1080502 11 22 23 24

travelapp_line的內容為

fileno bday e g h
1080501 2019/5/11 36 37 38
1080501 2019/5/12 66 55 77
1080501 2019/5/13 77 88 99
1080502 2019/5/10 14 25 36

請問要如何串成 travelapp_line 只要相同fileno的第一筆即可



結果是要呈現

1080501 2019/5/11 23 56 78 90
1080502 2019/5/10 11 22 23 24

該如何寫呢
謝謝







搜尋相關Tags的文章: [ sql ] , [ top ] ,
本篇文章發表於2019-05-02 10:18
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

Goldfish
檢舉此回應
select a.fileno, b.bday, a.a, a.b, a.c, a.d from travelapp as a left join (SELECT * FROM (SELECT row_number() OVER (partition BY fileno ORDER BY bday) AS _roworder, * FROM travelapp_line) AS s WHERE _roworder = 1) as b on a.fileno=b.fileno where b.bday between '2019/4/30' and '2019/5/30'


你的問題主要是以下這段
(SELECT * FROM (SELECT row_number() OVER (partition BY fileno ORDER BY bday) AS _roworder, * FROM travelapp_line) AS s WHERE _roworder = 1)

以fileno為主挑出一筆,以bday為排序,就要用到partition by ... order by ... 的語法
本篇文章回覆於2019-05-02 10:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

彩虹
檢舉此回應
比較好的做法是在 join 其他表的前,先使用 select min(bday),來抓出時間最早的第一筆,後續再做 join~

如下:

本篇文章回覆於2019-05-02 10:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

MStone Lin
檢舉此回應
回Goldfish :可以喔,感謝
回彩虹:試不出來耶...
本篇文章回覆於2019-05-02 11:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

彩虹
檢舉此回應
我發現只是「少打字】或「打錯文字」,不過你從報錯訊息應該能自行修正~~

travelapp_lin 改為 travelapp_line (少打e)
a.fileno 改為 a.filneo (ne vs en)

重新整理後如下:



再麻煩您試試看
本篇文章回覆於2019-05-02 22:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

彩虹
檢舉此回應
如果還試不出來,方便貼一下錯誤訊息

另外不曉得是你本身欄位名字有誤
你提供的範例 travelapp 表裡的第一個欄位,到底是【filneo】 還是【fileno】

剛剛在本機依照你提供的資料來做測試,沒有發生問題


本篇文章回覆於2019-05-02 22:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

MStone Lin
檢舉此回應
回彩虹

可以了喔 感恩
本篇文章回覆於2019-05-03 08:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

MStone Lin
檢舉此回應
回彩虹



這段是可以的,但還要串travelapp_line 其它欄位

發問內容是 select * from travelapp left...
我完整寫法是 select a.fileno 序號,b.bday 日期,b.e 出發時間,b.g 返回時間,b.h 進度 from travelapp as a left ....

所以還會串travelapp_line 還有其它欄位...e g h
如果使用group by ,又要加上group by e,g,h
但 e g h 這些都不一定重覆
又跑出多筆了..

所以有更好的寫法嗎??






本篇文章回覆於2019-05-03 08:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

MStone Lin
檢舉此回應
回彩虹

剛試了一下
要串出的欄位 都用min,是可以的...
本篇文章回覆於2019-05-03 08:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

彩虹
檢舉此回應
所以就是看你需求,才能決定怎麼做∼
原先你沒有提到需要 travelapp_line 的 e,g,h,所以直接搭配 max() 很快

但如果現在需要select e, g, h 出來,就會有其他做法∼
本篇文章回覆於2019-05-03 15:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.