2016-04-07 10 views
1

Ein typischer Fall ist Daten aus Tabellen bekommen, die jeden Tag mit neuen Namen wie unten generiert wird:SELECT * FROM MEHRERE + DYNAMIC table_name

select table_name from INFORMATION_SCHEMA.TABLES where table_name like 'ifhcraw%'; 

ifhcraw_2016_03_31_24 
ifhcraw_2016_04_01_8 
ifhcraw_2016_04_02_14 
ifhcraw_2016_04_03_20 
ifhcraw_2016_04_05_8 
ifhcraw_2016_04_06_14 

Wie Sie sehen können, gibt es eine Namenskonvention basiert auf Regel - "ifhcraw + Jahr + Monat + Tag + Stunde". Aber die Stunde der Generation ist nicht bekannt. Gibt es eine Möglichkeit, einige SQL-Skript zu erstellen, die alle Daten aus den Tabellen "where table_name like 'ifhcraw%'"

+0

Sie müssen dynamisches SQL mit einer 'PREPARE'-Anweisung in einer gespeicherten Prozedur verwenden. – Barmar

+1

Jeden Tag einen neuen Tisch zu kreieren, scheint ein schlechtes Design zu sein. Warum haben Sie nicht nur eine einzelne Tabelle, in der das Datum eine Spalte ist, die Sie abgleichen können? – Barmar

+0

@Barmar, könnten Sie ein kleines Beispiel geben? Vielleicht ist die Frage nicht klar. Ich muss Daten von allen Tabellen zur gleichen Zeit erhalten, wie: Wählen Sie * aus ifhcraw_2016_03_31_24, ifhcraw_2016_04_01_8 .... – Javid

Antwort

1

Sie können GROUP_CONCAT die Tabellennamen alle in einem einzelnen String zusammen verwenden zu können.

SELECT @queries := GROUP_CONCAT(CONCAT('SELECT * FROM ', table_name) SEPARATOR ' UNION ') 
FROM INFORMATION_SCHEMA.TABLES 
WHERE table_name LIKE 'ifhcraw%'; 

PREPARE stmt FROM @queries; 
EXECUTE stmt; 

Die erste Abfrage findet alle passenden Tabellennamen und erstellt eine Abfrage wie SELECT * FROM <tablename>. Dann verwendet sie GROUP_CONCAT sie alle mit UNION zu verbinden, so dass die resultierende Abfrage wie folgt aussieht:

SELECT * FROM table1 
UNION 
SELECT * FROM table2 
UNION 
SELECT * FROM table3 
... 

Beachten Sie, dass standardmäßig GROUP_CONCAT auf die Rückkehr 1024 Zeichen beschränkt ist. Wenn Sie viele dieser Tabellen haben, müssen Sie group_concat_max_len erhöhen, um alles zu bekommen.

+0

Danke, dass es funktioniert)) Aber ich verstehe die erste Variable nicht. Und deshalb kann ich für jede Tabelle keine Änderungen vornehmen wie 'WHERE ID = '9400''. – Javid

+0

Ich habe es getan '... GROUP_CONCAT (CONCAT ('SELECT * FROM', Tabellenname, 'WHERE ID = \' 9429 \ '') SEPARATOR 'UNION') ....' Vielen vielen Dank. – Javid

+0

Fügen Sie einen Vorbehalt zu 'group_concat_max_len' hinzu. – Barmar

Verwandte Themen