В моем опыте это лучше всего выполнять на программный уровень (создание этих динамических запросов).
Вы не знаете имена таблиц, но это не значит, что вы не можете создать хранилище для динамических имен (т. Е. Другую таблицу, называемую «table_meta», которая содержит список всех динамических таблиц).
Аналогичным образом, если вы хотите, чтобы динамическая таблица также имела динамические поля, вы могли создать таблицу для хранения сопоставления между созданной динамической таблицей и связанными с ней динамическими полями («fields_meta»), содержащими связь между таблицами между собой и его динамические поля).
Запрос таблиц «meta» для имени таблицы, а затем построение вашего запроса программно с использованием этого восстановленного имени (и аналогичных полей) позволяет запускать любые запросы, которые вы хотите использовать для динамических объектов.
Что касается присоединения к динамическим таблицам, то это предполагает, что у вас есть некоторое представление о полях, которые приводят к содержательному соединению. Если это так, вы можете создать свои динамические таблицы, но, по крайней мере, с одним статическим полем со значимыми данными, что позволит вам запросить таблицу «table_meta» для таблицы, а затем построить запрос в вашей программе с этим результатом для присоединения ваша таблица X на его статическом поле «join_here» с (повтор чтения из таблицы мета, чтобы получить Y) и присоединиться к нему на Y. «join_here» (статическое поле)
Очень грубый пример кода Судо:
List<String> sql-getDynamicTables = "select table_name from tables_meta";<br />
(results in X, Y, Z...)
if(sql-getDynamicTables.size > 1) { (make sure we have stuff to join on)
(Start building the query for the join)
String sql-performJoin = "select * from" + sql-getDynamicTables.get(0);
for(each additional database found) {
sql-performJoin += " join " + sql-getDynamicTables.get(index-i) + " on " + sql-getDynamicTables.get(index-i)+".staticField = "(or replace that with a separate variable containing the dynamic field)+ sql-getDynamicTables.get(0)".staticField, ";
}
(remove any trailing commas)
(add any where clause or whatever modifications to the query)
(run the query sql-performJoin)
}
Опять же, имена столбцов могут быть не одинаковыми, но вы можете запросить их, как мы делаем имена динамических таблиц, и построим запрос с этим вместо «.staticField» или любым другим, что вы выберете.
Просто убедитесь, что вы знаете, что данные, с которыми вы присоединяетесь, обеспечивают значимое соединение.
Как примечание: динамический SQL довольно болезнен и содержит множество соображений (дублирование имен таблиц и т. Д.). Возможно, стоит исследовать альтернативы, если вы все еще в эфире.
У меня проблемы с дизайном базы данных. –