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