sql >> Databasteknik >  >> RDS >> Mysql

Hur man kör samma fråga mot flera tabeller i databasen

FROM del av SELECT satsen måste ha faktiska tabellnamn, inte en CHAR(100) variabel som innehåller namnet på tabellen. Det fungerar bara inte så här.

Det ser ut som att du vill köra en viss fråga mot många tabeller med liknande struktur i din databas. Ganska ofta betyder det att databasschemat skulle kunna förbättras. Men om du måste ta itu med vad du har måste du använda dynamisk SQL . Den här länken till MySQL-dokumentationen har ett exempel "som visar hur man väljer tabellen som en fråga ska utföras på vid körning, genom att lagra tabellens namn som en användarvariabel", vilket är precis vad du behöver.

Inuti din loop måste du bygga en sträng med SQL-frågan och använda EXECUTE .

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

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

Såvitt jag förstår är resultatet av EXECUTE skickas till den som ringer den lagrade proceduren som om det vore en normal SELECT , så i det här exemplet kommer anroparen att få flera resultatuppsättningar om din databas har mer än en tabell where table_name like "%FAULT_20150320%" .

Här är en länk till en annan SO-fråga om MySQL dynamisk SQL Hur man har Dynamic SQL i MySQL Stored Procedure med några exempel.

Det verkar som att du vill ha något sånt här. Den ska summera antalet från flera tabeller i signatureCount 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$$

En annan variant, om antalet tabeller som du behöver bearbeta inte är mycket, är att dynamiskt bygga en stor SQL-sats som inkluderar alla tabeller i din loop och sedan EXECUTE det på en gång:

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


  1. Returnera en boolean från en PHP-fil till AJAX one - Follow-knappen

  2. Hur man definierar ett osignerat heltal i SQLAlchemy

  3. 2 inmatningsrutor för autoslutförande/förslag med jQuery eller Ajax med andra ruta baserat på första val med flera objekt

  4. Hur får man fråga om kolumnattribut från tabellnamn med PostgreSQL?