中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sql?in查詢元素超過1000條如何解決

發布時間:2023-03-07 16:13:26 來源:億速云 閱讀:185 作者:iii 欄目:MySQL數據庫

這篇文章主要介紹“sql in查詢元素超過1000條如何解決”,在日常操作中,相信很多人在sql in查詢元素超過1000條如何解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”sql in查詢元素超過1000條如何解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    一、場景描述

    查詢機構下的人員,要同時查詢出該機構及其所有下級機構的人員;比如查詢北京市,不僅要查詢出歸屬于北京市的人員,還要查詢歸屬于出朝陽區、西城區、海淀區等等的人員。

    對于這個需求,有以下幾種解決思路:

    1、之前的系統,他們的機構編碼本身有關聯,比如北京編碼是001的話,昌平區的編碼就是0012;這樣的話,他們查詢可以用like。這種方法的問題是like查詢太慢,尤其在數據量大的時候,即使對編碼加唯一索引,也只有查最根部機構時可以走索引(因為只有此時才符合最左前綴)。

    2、我們的系統沒有機構編碼,唯一標識是雪花算法生成的19位id,沒有關聯;機構關系是通過一張關聯表組合的起來的(適用于多業務系統,多機構樹的情況)。這種情況,可以通過條件從關系表中查出所有下級機構id,然后查詢時用in查詢;為了方便查詢,我們還建了一張機構關系冗余表。
    但是這種方法也有一個問題,就是Oracle數據庫in查詢中元素,必須在1000以內。

    二、解決方案

    1、方案一:核心思路是,將集合拆分,使用or 連接。

    select * from A where id in (1, 2, …, 1000) or id in (1001, …, 1999)

    用mybatis的話就是這樣

    select * from test_1
    <where>
     <if test="list != null and list.size > 0">
        (id IN
        <!-- 處理in的集合超過1000條時Oracle不支持的情況 -->
        <trim suffixOverrides=" OR id IN()">
            <foreach collection="list " item="Id" index="index" open="(" close=")">
                <if test="index != 0">
                    <choose>
                        <when test="index % 1000 == 999">) OR id IN (</when>
                        <otherwise>,</otherwise>
                    </choose>
                </if>
                #{Id}
            </foreach>
        </trim>
        )
     </if>

    但是這種方法不好用,實測中3萬條左右的機構,用這種查詢查了好久都沒出來,感覺數據庫都要奔潰了。

    2、方案二:用子查詢(臨時表)+關聯查詢

    一般來說,超過1000多條的數據,肯定不是用戶填寫的,而是從其他地方查詢出來的;我們可以將這些數據放到一個臨時表中(用子查詢實現),然后用內連接關聯查詢。

    sql?in查詢元素超過1000條如何解決

    該查詢中,機構關系冗余表SEP_SYSTEM_ORG_RELATION中有20多萬條數據,但子查詢走了我們創建的組合索引;整個查詢只用了0.367秒

    sql?in查詢元素超過1000條如何解決

    到此,關于“sql in查詢元素超過1000條如何解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    鄂温| 安国市| 囊谦县| 蕲春县| 巴东县| 孝昌县| 宁乡县| 临漳县| 太白县| 郓城县| 阜新| 大城县| 博罗县| 河北省| 上高县| 西青区| 屏南县| 珠海市| 革吉县| 碌曲县| 泰来县| 合作市| 伊金霍洛旗| 荣昌县| 鹿泉市| 嘉义县| 同德县| 昂仁县| 全州县| 寿光市| 无棣县| 桦川县| 新沂市| 海伦市| 聂拉木县| 津市市| 阜城县| 黎平县| 涟水县| 夏河县| 来宾市|