日常開發sql使用總結
阿新 • • 發佈:2018-12-17
1、關聯分頁查詢
關聯分頁查詢是日常開發中常見的,使用MybatisPlus外掛後,單表分頁查詢變得很簡單,一條語句就可以搞定了如下:
String staffGid = (String) params.get("staffGid"); Page<BkXcOrder> page = this.selectPage( new Query<BkXcOrder>(params).getPage(), new EntityWrapper<BkXcOrder>() .eq(StringUtils.isNotBlank(staffGid), "STAFF_GID", staffGid) //查詢條件 );
那麼多表關聯分頁查詢怎麼做呢?
首先利用外掛分頁,查詢出來分頁的currentPage
、pageSize
、totalPage
、totalCount
以及分頁的資料主鍵 ids
,然後再根據主鍵ids
來查詢這些pageSize
多條資料。如下:
@GetMapping("/queryPageBookHistoryVo") public R<PageUtils> queryPageBookHistoryVo(@RequestParam Map<String, Object> params) { //params 引數包含page、limit、staffGid資訊 String staffGid = (String) params.get("staffGid"); Assert.isBlank(staffGid, "引數錯誤!"); //先查分頁資料 PageUtils page = bkXcOrderService.queryPage(params); List<BkXcOrder> bkXcOrderList = (List<BkXcOrder>) page.getList(); List<String> ids = new ArrayList<>(); //拼接引數 bkXcOrderList.forEach(item -> { ids.add(item.getGid()); }); //根據id來查詢關聯分頁資料 page.setList(bkXcOrderService.queryListByPage(ids, staffGid)); return RUtils.ok(page); }
其中 queryListByPage
dao 層的關聯查詢如下:
//當包含多個引數的時候,要用@Param註解來區分 List<BookHistoryVo> queryListByPage(@Param("ids") List ids, @Param("staffGid") String staffGid); <select id="queryListByPage" resultType="com.sx.purchase.VO.BookHistoryVo"> SELECT bk_passport.GID customerGid , bk_passport.REAL_NAME customerName, bk_book.GID bookGid, bk_book.BOOKNAME bookname, bk_book.AUTHOR author, bk_book.ISBN isbn , bk_book.PRICE price , bk_passport.POSITION position, bk_passport.DEPARTMENT department FROM BK_XC_ORDER bk_order INNER JOIN BK_XC_PASSPORT_INFO bk_passport ON bk_order.CUSTOMER_GID = bk_passport.GID INNER JOIN BK_XC_BOOKS bk_book ON bk_order.BIBGID = bk_book.GID <where> <if test="staffGid != null and staffGid != ''"> AND bk_order.STAFF_GID=#{staffGid} </if> <if test=" ids != null and ids.size != 0"> AND bk_order.GID in <foreach collection="ids" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> </where> </select>
2、刪庫別跑路sql
昨天主管把一個線上的兩個表的資料直接 delete 了,慌得一匹。差點要跑路了,讓他懵逼的一天。
我們公司使用的是oracle資料庫,當你把資料刪除了後,怎麼找回來呢?
可以使用以下語句查詢出來在 2018-10-22 10:19:00
時間節點上的資料:
select * from BK_ORDER_FORMLIST as of timestamp to_Date('2018-10-22 10:19:00', 'yyyy-mm-dd hh24:mi:ss');
3、按照欄位查重
根據某個欄位來查詢表中這個欄位是否有重複的行。
SELECT a.PHONE FROM (SELECT count(*) num,PHONE FROM BK_PASSPORT_INFO GROUP BY PHONE) a WHERE a.num >1;
4、批量新增資料
市場提出這樣的要求:要求給指定公司的使用者批量新增一個預設的地址。其中具體的使用者資料是表裡面查詢的,而有的資料如地址這些是常量,那麼怎麼來批量插入這些資料,如下:
INSERT INTO BK_USERMAIL_ADDR(GID,PASSPORT_GID,CREATE_DATE,RECEIVE_NAME,RECEIVE_ADDR,RECEIVE_TEL,RECEIVE_POSTCODE,ISDEFAULT,PROVINCE,CITYNAME,DISTRICTNNAME)
SELECT SEQGID,GID ,SYSDATE,REAL_NAME,'金融大街31號中國電信',PHONE,'000000',0,'北京市','市轄區', '西城區'
FROM BK_PASSPORT_INFO WHERE COMPANY_ID = '2017120818324600103';
其中SEQGID
是ORACLE的序列函式,SYSDATE
是時間日期函式,GID ,REAL_NAME
等為表中欄位。
後續陸續更新…