Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara menjalankan kueri yang sama terhadap beberapa tabel dalam database

FROM bagian dari SELECT pernyataan harus memiliki nama tabel yang sebenarnya, bukan CHAR(100) variabel yang berisi nama tabel. Ini tidak bekerja seperti ini.

Sepertinya Anda ingin menjalankan kueri tertentu terhadap banyak tabel dengan struktur serupa di database Anda. Cukup sering itu berarti bahwa skema database dapat ditingkatkan. Tetapi, jika Anda harus berurusan dengan apa yang Anda miliki, Anda harus menggunakan SQL dinamis . Tautan ke dokumentasi MySQL ini memiliki contoh "yang mendemonstrasikan cara memilih tabel untuk melakukan kueri saat runtime, dengan menyimpan nama tabel sebagai variabel pengguna", yang persis seperti yang Anda butuhkan.

Di dalam loop Anda, Anda perlu membuat string dengan kueri SQL dan menggunakan EXECUTE .

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

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

Sejauh yang saya mengerti, hasil dari EXECUTE dikirim ke pemanggil prosedur tersimpan seolah-olah itu adalah SELECT normal yang normal , jadi dalam contoh ini pemanggil akan menerima beberapa kumpulan hasil jika database Anda memiliki lebih dari satu tabel where table_name like "%FAULT_20150320%" .

Berikut ini tautan ke pertanyaan SO lainnya tentang SQL dinamis MySQL Cara memiliki SQL Dinamis di MySQL Stored Procedure dengan beberapa contoh.

Sepertinya Anda menginginkan sesuatu seperti ini. Itu harus meringkas jumlah dari beberapa tabel di 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$$

Varian lain, jika jumlah tabel yang perlu Anda proses tidak banyak, adalah membangun secara dinamis satu pernyataan SQL besar yang mencakup semua tabel di dalam loop Anda dan kemudian EXECUTE sekaligus:

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. Di MySQL, dengan FK, apa yang dilakukan CONSTRAINT?

  2. Lacak skrip perubahan/revisi di PHP?

  3. Pencarian geospasial MySQL menggunakan rumus haversine mengembalikan nol pada titik yang sama

  4. PHP Mysql bergabung di seluruh database

  5. Pernyataan MYSQL IN