Generisches Beispiel (in PHP):
Das Erstellen von dynamischem SQL oder das Erstellen Ihrer SQL-Abfragen mit Hilfe einer Programmiersprache würde so aussehen (z. B. in PHP):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
Der fetchAll
-Methode gibt ein Array zurück, das die Namen jeder ausgewählten Tabelle enthält.
Der implode($glue, $array)
Die Funktion nimmt ein Array und verkettet jeden Wert im Array mit $glue
Parameter - normalerweise nehmen Sie ein Array von Werten und implodieren sie mit $glue = ','
um eine durch Komma getrennte Werteliste zu erstellen.
In unserem Fall der implode
hat eine Teilabfrage als $glue
um einen großen UNION JOIN
zu erstellen Abfrage.
Einmal die letzte $query
aufgebaut ist, sollte es in etwa so aussehen:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Das Ergebnis sollte den gesamten DISTINCT
enthalten Zeilen aus allen 4000 Tabellen.
Spezifisches Beispiel (nur im SQL-Format):
SELECT GROUP_CONCAT(
CONCAT('select * from ', table_name)
SEPARATOR ' union '
)
INTO @my_variable
FROM information_schema.tables
WHERE table_schema = 'dbname'
AND table_name LIKE '%_name';
PREPARE my_statement FROM @my_variable;
EXECUTE my_statement;
- Die erste Anweisung erhält alle Tabellennamen aus dem
information_schema
Datenbank; - Der
CONCAT
Funktion stellt jedem Tabellennamen ein'SELECT * FROM '
voran Zeichenkette; - Der
GROUP_CONCAT
erledigt die Aufgabe, dieimplode
in PHP getan hätte; -
Der
INTO
-Klausel stellt sicher, dass die Werte in einer Variablen namensmy_variable
gespeichert werden; -
Das
PREPARE
-Anweisung nimmt einen Zeichenfolgenwert (wie den, den Sie inmy_variable
gespeichert haben ) und prüft, ob der Wert eine SQL-Abfrage ist; - Das
EXECUTE
Statement nimmt ein "vorbereitetes Statement" und führt es aus.
@my_variable ist eine temporäre Variable, aber sie kann nur von einem skalaren Typ sein (varchar, int, date, datetime, binary, float, double etc.), sie ist nicht ein Array.
Der GROUP_CONCAT
Die Funktion ist eine "Aggregatfunktion", was bedeutet, dass sie einen Aggregatwert nimmt (ähnliches Konzept wie ein Array - in unserem Fall die Ergebnismenge unserer Abfrage) und ein einfaches Zeichenfolgenergebnis ausgibt.