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

WHILE構文-MySQLのエラー

    この手続き型コードを匿名ブロックとして実行しようとしているように見えます。これは一部のデータベース(Oracleなど)では機能しますが、MySQLでは実行できません。

    これを実行する場合は、ストアドプロシージャに入れてから、プロシージャを呼び出します。したがって:

    プロシージャの作成

    DELIMITER $$
    
    CREATE PROCEDURE `foo_update_routine`()
    BEGIN
      WHILE ((SELECT COUNT(*) FROM 
        (SELECT id, COUNT(*) AS cnt
          FROM foo
          GROUP BY id
          ORDER BY COUNT(*) DESC
        ) cnts
        WHERE cnt > 1) != 0) 
      DO
        SET @curr_id = (SELECT id FROM 
          (SELECT id, COUNT(*) AS cnt
             FROM foo
             GROUP BY id
             ORDER BY COUNT(*) DESC
          ) cnts
          WHERE cnt > 1
          LIMIT 1);
    
        SET @new_id = (SELECT MAX(id) + 1 FROM foo);
    
        UPDATE foo SET id = @new_id 
          WHERE id = @curr_id 
          LIMIT 1;
    
      END WHILE;
    END $$
    

    通話手順

    CALL `foo_update_routine`;
    

    PS HAVING句 を調査することをお勧めします 選択したステートメントについて...




    1. SQLite Max()のしくみ

    2. SQL Server、名前付きインスタンスをデフォルトインスタンスに変換しますか?

    3. Railsの移行:PostgreSQL上のBigintが失敗しているようですか?

    4. Pythonのpsycopg2で.sqlスキーマを実行します