Mysql
 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%" .

Ето връзка към друг SO въпрос относно MySQL динамичен SQL Как да имате динамичен SQL в MySQL Stored Procedure с някои примери.

Изглежда, че искате нещо подобно. Той трябва да сумира броя от няколко таблици в 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$$

Друг вариант, ако броят на таблиците, които трябва да обработите, не е много, е да изградите динамично един голям SQL израз, който включва всички таблици във вашия цикъл и след това EXECUTE наведнъж:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel Вземете идентификатор на запис от заявка за актуализиране

  2. как Избор на рождени дни 7 дни преди днес в mysql

  3. Как да подобрим скоростта на записите в InnoDB в секунда на MySQL DB

  4. MySQL:уникален индекс, който не спазва нулеви стойности

  5. Как да свържете Android с MySQL с помощта на Mysql JDBC драйвер