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

データベース内の複数のテーブルに対して同じクエリを実行する方法

    FROM SELECTの一部 ステートメントには、CHAR(100)ではなく、実際のテーブル名が必要です。 テーブルの名前を含む変数。このようには機能しません。

    データベース内の同様の構造を持つ多くのテーブルに対して特定のクエリを実行したいようです。多くの場合、データベーススキーマを改善できることを意味します。ただし、持っているものに対処する必要がある場合は、動的SQL 。このMySQLドキュメントへのリンクには、「テーブルの名前をユーザー変数として格納することにより、実行時にクエリを実行するテーブルを選択する方法を示す」例があります。これはまさに必要なものです。

    ループ内では、SQLクエリを使用して文字列を作成し、EXECUTEを使用する必要があります。 。

    SET @s = CONCAT('select count(distinct signature) from ', tableName);
    
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    私が理解している限り、EXECUTEの結果 通常のSELECTであるかのようにストアドプロシージャの呼び出し元に送信されます したがって、この例では、データベースに複数のテーブルが存在する場合、呼び出し元は複数の結果セットを受け取ります。where table_name like "%FAULT_20150320%"

    これは、MySQL動的SQLに関する別のSO質問へのリンクですMySQLストアドプロシージャで動的SQLを使用する方法 いくつかの例を挙げます。

    このようなものが欲しいようです。 signatureCount内のいくつかのテーブルからのカウントを合計する必要があります 変数。

    CREATE PROCEDURE CountSignatures()
    BEGIN
        DECLARE done INT DEFAULT FALSE;
        DECLARE signatureCount INT;
        DECLARE tableName CHAR(100);
        DECLARE tableList CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE "%FAULT_20150320%";
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        SET signatureCount = 0;
        OPEN tableList;
        tableListLoop: LOOP
            SET done = FALSE;
            FETCH tableList INTO tableName;
            IF done THEN
                LEAVE tableListLoop;
            END IF;
    
            SET @VarCount = 0;
            SET @VarSQL = CONCAT('SET @VarCount = (SELECT COUNT(DISTINCT signature) FROM ', tableName, ')');
    
            PREPARE stmt FROM @VarSQL;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
    
            SET signatureCount = signatureCount + @VarCount;
        END LOOP;
        CLOSE tableList;
    
        SELECT signatureCount;
    END$$
    

    もう1つの方法は、処理する必要のあるテーブルの数が少ない場合、ループ内のすべてのテーブルを含む1つの大きなSQLステートメントを動的に作成してから、EXECUTEを作成することです。 一度に:

    SELECT 
    (COUNT(DISTINCT signature) FROM Table1) +
    (COUNT(DISTINCT signature) FROM Table2) +
    ...
    (COUNT(DISTINCT signature) FROM TableN) AS TotalCount
    


    1. スクリプトがログインしません

    2. DjangoORMを使用してMYSQL5.5以降に絵文字を挿入する方法

    3. 下位バージョンでのSQLServerデータベースのバックアップの復元

    4. 1つのクエリでPyMySQLの異なる更新?