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_schema
databas; CONCAT
funktion prefix varje tabellnamn med a'SELECT * FROM '
sträng;GROUP_CONCAT
gör jobbet somimplode
skulle ha gjort i PHP;-
INTO
satsen 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; EXECUTE
statement 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.