Allmänt exempel (i PHP):
Att konstruera dynamisk SQL eller bygga dina SQL-frågor med hjälp av ett programmeringsspråk skulle se ut så här (i PHP till exempel):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
fetchAll metod returnerar en array som innehåller namnen på varje tabell som valts.
implode($glue, $array) funktionen tar en array och sammanfogar varje värde i arrayen med hjälp av $glue parameter - vanligtvis tar du en rad värden och imploderar dem med $glue = ',' för att skapa en komaseparerad lista med värden.
I vårt fall implode har en delfråga som $glue för att skapa en stor UNION JOIN fråga.
När den sista $query är byggd ska det se ut ungefär så här:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Resultatet bör innehålla alla DISTINCT rader från alla 4000 tabeller.
Särskilt exempel (endast i 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;
- Den första satsen får alla tabellnamn från
information_schemadatabas; CONCATfunktion prefix varje tabellnamn med a'SELECT * FROM 'sträng;GROUP_CONCATgör jobbet somimplodeskulle ha gjort i PHP;-
INTOsatsen ser till att värdena sparas i en variabel som hetermy_variable; -
PREPARE-satsen tar ett strängvärde (som det du sparade imy_variable) och kontrollerar om värdet är en SQL-fråga; EXECUTEstatement tar ett "prepared statement" och väl... exekverar det.
@my_variable är en temporär variabel men den kan bara vara av skalär typ (varchar, int, date, datetime, binary, float, double etc.) den är inte en array.
GROUP_CONCAT funktion är en "aggregerad funktion" vilket betyder att den tar ett aggregerat värde (liknande koncept som en array - i vårt fall resultatuppsättningen av vår fråga) och matar ut ett enkelt strängresultat.