Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uruchomić to samo zapytanie w wielu tabelach w bazie danych

FROM część SELECT Instrukcja musi mieć rzeczywiste nazwy tabel, a nie CHAR(100) zmienna zawierająca nazwę tabeli. To po prostu tak nie działa.

Wygląda na to, że chcesz uruchomić określone zapytanie w wielu tabelach o podobnej strukturze w Twojej bazie danych. Często oznacza to, że schemat bazy danych można by poprawić. Ale jeśli masz do czynienia z tym, co masz, musisz użyć dynamiczny SQL . To łącze do dokumentacji MySQL zawiera przykład „pokazujący, jak wybrać tabelę, na której chcesz wykonać zapytanie w czasie wykonywania, przechowując nazwę tabeli jako zmienną użytkownika”, czyli dokładnie to, czego potrzebujesz.

Wewnątrz pętli musisz zbudować ciąg z zapytaniem SQL i użyć EXECUTE .

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

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

O ile rozumiem, wynik EXECUTE jest wysyłany do wywołującego procedury składowanej tak, jakby był to normalny SELECT , więc w tym przykładzie osoba wywołująca otrzyma wiele zestawów wyników, jeśli baza danych zawiera więcej niż jedną tabelę where table_name like "%FAULT_20150320%" .

Oto link do innego pytania SO dotyczącego dynamicznego SQL MySQL Jak mieć dynamiczny SQL w procedurze przechowywanej MySQL z kilkoma przykładami.

Wygląda na to, że chcesz czegoś takiego. Powinien zsumować zliczenia z kilku tabel w signatureCount zmienna.

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

Innym wariantem, jeśli liczba tabel, które musisz przetworzyć, jest niewielka, jest dynamiczne zbudowanie jednej dużej instrukcji SQL, która zawiera wszystkie tabele w pętli, a następnie EXECUTE to za jednym zamachem:

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. Jak prawidłowo przekazać zmienne sesji w adresie URL JDBC?

  2. Jak znaleźć najpopularniejsze wystąpienia słów w MySQL?

  3. Pobranie PDO zwraca tylko pierwszy wiersz

  4. Jak przekazać ArrayList<String> do innej aktywności i przekonwertować ją na double?

  5. Konwertuj POINT MySQL na tekst w PHP