sql >> データベース >  >> RDS >> Mysql

MySQL:不足している注文IDを見つける

    これを行う別の解決策は次のとおりです。

    CREATE TABLE TEMP 
    (n int);
    INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
    
    SET @maxid = (SELECT MAX(orders_id) FROM orders);
    
    SELECT     s.id 
    FROM
    (
        SELECT id
        FROM
        (
           SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
           FROM         TEMP AS t1
           CROSS JOIN TEMP AS t2
           CROSS JOIN TEMP AS t3
           CROSS JOIN TEMP AS t4
        ) t 
        WHERE id BETWEEN 1000 AND @maxid
    ) s 
    LEFT JOIN orders t ON s.id = t.`orders_id` 
    WHERE t.`orders_id` IS NULL;
    

    これにより、orders_idが得られます。 s:

    ID
    1001
    1002
    1005
    1006
    1008
    1009
    1010
    1011
    1012
    1013
    1014
    1015
    1016
    1017
    1018
    1019
    1021
    1022
    1023
    1024
    

    SQLフィドルデモ

    注意: TEMPを作成しました 投稿したクエリで行ったwhileループの代わりに、1から10000までの値を含むアンカーテーブルを生成するために使用するために、0から9までの値を持つテーブル。テーブルの値に応じて、このテーブルの値を制御できます。 10000を超える値がある場合CROSS JOIN TEMP もう一度テーブルに。

    更新: orders_idの場合 データ型はvarcharです INTEGERにキャストするだけです そのように:

    SELECT     s.id 
    FROM
    (
        SELECT id
        FROM
        (
           SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
           FROM         TEMP AS t1
           CROSS JOIN TEMP AS t2
           CROSS JOIN TEMP AS t3
           CROSS JOIN TEMP AS t4
      ) t WHERE id between 1000 AND @maxid
    ) s 
    LEFT JOIN
    (
        SELECT CONVERT(orders_id, UNSIGNED INTEGER) AS orders_id 
        FROM orders
    ) t ON s.id = t.`orders_id` 
    WHERE t.`orders_id` IS NULL;
    

    SQLフィドルデモを更新




    1. Oracleデータベースでユーザー定義のレコードデータ型変数を作成する方法

    2. OUTPUTinserted.idを選択した行の値と組み合わせます

    3. postgresqlデータベースを使用してweb2pyスケジューラーを実行できません

    4. Oracleデータアクセスバージョンの問題