Ogólny przykład (w PHP):
Konstruowanie dynamicznego SQL lub budowanie zapytań SQL za pomocą języka programowania wyglądałoby tak (np. w PHP):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
fetchAll
metoda zwróci tablicę zawierającą nazwy każdej wybranej tabeli.
implode($glue, $array)
funkcja pobiera tablicę i łączy wszystkie wartości w tablicy za pomocą $glue
parametr - zwykle bierzesz tablicę wartości i implodujesz je za pomocą $glue = ','
aby utworzyć listę wartości oddzielonych przecinkami.
W naszym przypadku implode
ma częściowe zapytanie jako $glue
w celu stworzenia jednego dużego UNION JOIN
zapytanie.
Po ostatnim $query
jest zbudowany, powinien wyglądać mniej więcej tak:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Wynik powinien zawierać wszystkie DISTINCT
wiersze ze wszystkich 4000 tabel.
Konkretny przykład (tylko w formacie 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;
- Pierwsza instrukcja pobierze wszystkie nazwy tabel z
information_schema
baza danych; CONCAT
funkcja poprzedza każdą nazwę tabeli przedrostkiem'SELECT * FROM '
ciąg;GROUP_CONCAT
wykonuje zadanie, któreimplode
zrobiłbym w PHP;-
INTO
klauzula zapewnia, że wartości są zapisywane wewnątrz zmiennej o nazwiemy_variable
; -
PREPARE
instrukcja przyjmuje wartość ciągu (taką jak ta, którą zapisałeś wmy_variable
) i sprawdza, czy wartość jest zapytaniem SQL; EXECUTE
instrukcja pobiera "przygotowaną instrukcję" i cóż... wykonuje ją.
@moja_zmienna jest zmienną tymczasową, ale może być tylko typu skalarnego (varchar, int, date, datetime, binarny, float, double itp.), nie tablica.
GROUP_CONCAT
funkcja jest "funkcją agregującą", co oznacza, że pobiera wartość zagregowaną (pojęcie podobne do tablicy - w naszym przypadku zestaw wyników naszego zapytania) i wyprowadza prosty wynik w postaci ciągu.