#java #sql #sql-server #database #data-structures
#java #sql #sql-сервер #База данных #структуры данных
Вопрос:
У меня есть требование динамически извлекать данные из нескольких таблиц. Итак, у меня есть 2 таблицы конфигурации для хранения информации об этих таблицах. Одна таблица содержит информацию из списка таблиц, как показано ниже:
TableName TableCode TableColumn
----------------------------------------
a a a1
a a a2
b b b1
b b b2
b b b3
c c c1
c c c2
d d d1
d d d2
У меня есть другая таблица, в которой хранятся отношения между этими таблицами:
RelationshipType TableCode1 TableCode2 TableColumn1 TableColumn2
-----------------------------------------------------------------------------
inner a b a1 b1
inner a b a2 b2
inner c d c1 d1
inner c b c2 b3
На основе приведенной выше конфигурации мне нужно создать динамический запрос, как показано ниже:
select a.a1, a.a2, b.b1, b.b2, b.b3, c.c1, c.c2, d.d1, d.d2
from b
inner join a on b.b1 = a.b1 and b.b2 = a.b2
inner join c on b.b3 = c.c2
inner join d on c.c1 = d.d1
Теперь соединения могут быть внутренними, левыми или правыми, а порядок вставки в таблицу отношений может быть любым, но между всеми таблицами обязательно будет взаимосвязь. Каков наилучший оптимизированный способ создания динамического запроса? Должен ли я искать в таблице отношений родительскую таблицу most, а затем создавать дерево, чтобы найти связь с другими таблицами? Должен ли я поддерживать последовательность в таблице отношений, чтобы найти родительскую таблицу most и соответствующие таблицы?
Комментарии:
1. Не могли бы вы сообщить, какую СУБД вы используете?
2. Это Microsoft SQL Server 2014
3. Привет, вы нашли решение этой проблемы?
Ответ №1:
Шаги:
-
выберите * из порядка таблицы внутренних соединений relationship_table по типу RelationshipType desc, TableCode1, TableCode2 (Порядок RelationshipType обусловлен тем, что сначала всегда выполняется внутреннее объединение. И упорядочение табличных кодов связано с тем, что если следующее отношение также включает в себя те же таблицы, условие должно быть объединено)
-
перебирайте каждую строку, если предыдущий код таблицы и текущий код таблицы одинаковы, добавьте только условие в ‘conditionstring’ . Если нет, добавьте новое соединение с именами таблиц и условием в ‘conditionstring’. добавьте столбцы в ‘columnlist’.
-
Теперь ‘select’ columnlist ‘from’ conditionstring должен выдать вам запрос
Надеюсь, это поможет вам