sql >> Database >  >> RDS >> Mysql

Hoe dezelfde query op meerdere tabellen in de database uit te voeren?

De FROM onderdeel van de SELECT statement moet echte tabelnamen hebben, geen CHAR(100) variabele die de naam van de tabel bevat. Zo werkt het gewoon niet.

Het lijkt erop dat u een bepaalde query wilt uitvoeren op veel tabellen met een vergelijkbare structuur in uw database. Vaak betekent dit dat het databaseschema kan worden verbeterd. Maar als je te maken hebt met wat je hebt, moet je dynamische SQL . Deze link naar MySQL-documentatie heeft een voorbeeld "dat laat zien hoe u de tabel kiest waarop u tijdens runtime een query wilt uitvoeren, door de naam van de tabel op te slaan als een gebruikersvariabele", en dat is precies wat u nodig hebt.

Binnen je lus moet je een string bouwen met de SQL-query en EXECUTE . gebruiken .

SET @s = CONCAT('select count(distinct signature) from ', tableName);

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Voor zover ik begrijp, is het resultaat van de EXECUTE wordt verzonden naar de beller van de opgeslagen procedure alsof het een normale SELECT is , dus in dit voorbeeld zal de beller meerdere resultatensets ontvangen als uw database meer dan één tabel heeft where table_name like "%FAULT_20150320%" .

Hier is een link naar een andere SO-vraag over MySQL dynamische SQL Dynamische SQL in MySQL opgeslagen procedure hebben met enkele voorbeelden.

Het lijkt erop dat je zoiets wilt. Het zou de tellingen van verschillende tabellen in signatureCount moeten samenvatten variabel.

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$$

Een andere variant, als het aantal tabellen dat u moet verwerken niet veel is, is om dynamisch één grote SQL-instructie te bouwen die alle tabellen in uw lus bevat en vervolgens EXECUTE het in één keer:

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


  1. De PostgreSQL-correlatiefunctie gebruiken

  2. Hoe Google Cloud SQL te verbinden met C#

  3. Verbinding maken met een mySQL-database via asp.net

  4. mysqli_stmt::bind_param():Aantal elementen in typedefinitietekenreeks komt niet overeen met aantal bindvariabelen