1. 程式人生 > >日常開發sql使用總結

日常開發sql使用總結

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)  //查詢條件
        );
        

那麼多表關聯分頁查詢怎麼做呢?
首先利用外掛分頁,查詢出來分頁的currentPagepageSizetotalPagetotalCount 以及分頁的資料主鍵 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等為表中欄位。

後續陸續更新…