Ejemplo genérico (en PHP):
La construcción de SQL dinámico o la creación de sus consultas SQL con la ayuda de un lenguaje de programación se vería así (en PHP, por ejemplo):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
El fetchAll
devolverá una matriz que contiene los nombres de cada tabla seleccionada.
El implode($glue, $array)
La función toma una matriz y concatena cada valor en la matriz usando $glue
parámetro:generalmente toma una matriz de valores y los implosiona usando $glue = ','
para crear una lista de valores separados por comas.
En nuestro caso, implode
tiene una consulta parcial como $glue
para crear un gran UNION JOIN
consulta.
Una vez que el $query
final es construir debería verse algo como:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
El resultado debe contener todos los DISTINCT
filas de las 4000 tablas.
Ejemplo específico (en formato solo SQL):
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;
- La primera instrucción obtendrá todos los nombres de las tablas del
information_schema
base de datos; - El
CONCAT
la función antepone cada nombre de tabla con un'SELECT * FROM '
cadena; - El
GROUP_CONCAT
hace el trabajo queimplode
hubiera hecho en PHP; -
El
INTO
cláusula se asegura de que los valores se guarden dentro de una variable llamadamy_variable
; -
El
PREPARE
declaración toma un valor de cadena (como el que guardó enmy_variable
) y comprueba si el valor es una consulta SQL; - El
EXECUTE
La declaración toma una "declaración preparada" y bueno... la ejecuta.
@my_variable es una variable temporal pero solo puede ser de tipo escalar (varchar, int, date, datetime, binary, float, double, etc.) no una matriz.
El GROUP_CONCAT
La función es una "función agregada", lo que significa que toma un valor agregado (concepto similar a una matriz; en nuestro caso, el conjunto de resultados de nuestra consulta) y genera un resultado de cadena simple.