2014-02-05 3 views
0

Вот мой Schema:динамический SQL динамически создавать имя столбца из значения поля

Таблица t1:

x1 y1 
    1  2 

Таблица t2:

x2 y2 
    1 'x1' 
    2 'y2' 

мне нужно для использования динамических SQL для объединения этих двух таблиц и столбец соединения таблицы t1 должен определяться значением столбца y2.

Я пробовал очень уродливый и неработающий SQL причины бесполезности.

select * from t1 join t2 t on t2.x2 = t1.(select y2 from t2 where x2=t.x2); 

Я очень новой для динамическогоSQL поэтому не знаю, как этого добиться.

P.S. : Значения, приведенные выше, приведены только для примера. Фактически, обе таблицы динамически создаются, поэтому необязательно имена столбцов будут одинаковыми. Кроме того, число столбцов может отличаться, следовательно, поворотное не может быть, что полезно

+0

У меня проблемы с дизайном базы данных. –

ответ

0

Вам не нужно динамический SQL, такой больше логики в предложении on:

select * 
from t1 join 
    t2 t 
    on t2.x2 = t1.x1 and t2.y2 = 'x1' or 
     t2.x2 = t1.y1 and t2.y2 = 'y1'; 
+0

Спасибо, это хорошо. Но обе таблицы динамически создаются, поэтому нет необходимости, имена столбцов будут одинаковыми. Кроме того, номера столбцов могут отличаться, поэтому поворот может оказаться полезным. – user2407394

0

В моем опыте это лучше всего выполнять на программный уровень (создание этих динамических запросов).

Вы не знаете имена таблиц, но это не значит, что вы не можете создать хранилище для динамических имен (т. Е. Другую таблицу, называемую «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 довольно болезнен и содержит множество соображений (дублирование имен таблиц и т. Д.). Возможно, стоит исследовать альтернативы, если вы все еще в эфире.

Смежные вопросы