[SQL ] subselect 想要傳回多欄位要如何改?

看板Database (資料庫)作者 (汪汪)時間8年前 (2016/04/18 15:27), 8年前編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
資料庫名稱: MySQL 資料庫版本: 5.X 內容/問題描述: 小弟最近由xbase轉到mysql 一些觀念不太清楚。 Table a 基本檔 -------------------- chno(primary) chnm pice samt ... Table b 月用量檔 ---------------- chno (此兩欄為primary) yymm (此兩欄為primary) tamt iamt oamt lamt .... 月份檔不一定每個chno+ymmm都有(無進也無出則此月無記錄) 假設想列出1603月的月報(若不存在則取之前最近的月份) ^^^^^^^^^^^^^^^^^^^^^^^^^^ 目前想到的語法是: SELECT chno, chnm, pice, samt, ( SELECT LAMT, IAMT, OAMT, TAMT... FROM b WHERE b.chno = a.chno AND yymm <= '1603' ORDER BY yymm DESC LIMIT 1 ) FROM a WHERE chno >= '50000' AND chno <= '5ZZZZ' 好像不對是吧,mysql說只可以有一個欄位。 用left join嗎? 但 "若不存在則取之前最近的月份" 的where要怎麼寫呢? 每個欄位都要加IFNULL(cloumnx,0) 也梃麻煩, 有整體性的令NULL = 0 嗎? 若有問錯觀念,請多加鞭策XD 謝謝大家! -- 04/18 22:46補充 目前試出下面的語法, 是能得到想要的結果了, 不知還有改進的空間嗎? select a.chno ,a.chnm ,a.pice ,a.samt ... ,IFNULL(max(b.yymm),'') as yymm ,IFNULL(b.tamt,0) as tamt ,IFNULL(b.iamt,0) as iamt ,IFNULL(b.oamt,0) as oamt ,IFNULL(b.lamt,0) as lamt ... from a left join b on a.chno=b.chno and b.yymm<='1603' group by chno ----------------------------------- 04/19 15:31補充 結果是錯的,yymm是我想要的,其他(tamt,iamt,oamt,lamt)確是不確定的任一筆。 對於a中的每一筆,我想要的b是: SELECT * FROM b WHERE chno = '0505' //(a.chno) AND yymm <= '1603' ORDER BY yymm DESC LIMIT 1 取得不大於'1603'的最新紀錄 還想不通如何合併sql命令。 ※ 編輯: jonce007 (61.216.136.100), 04/19/2016 15:25:09

04/20 11:18, , 1F
目前用暴力法,先select a, 前端再逐筆slect 所需的b :(
04/20 11:18, 1F
文章代碼(AID): #1N58nR-g (Database)
文章代碼(AID): #1N58nR-g (Database)