Как мы можем получить значение столбца для использования в качестве имени таблицы для внутреннего соединения?

Как мы можем ссылаться на значение столбца из одной таблицы в качестве ссылки для соединения (см. пример ниже)?

SELECT t1.*, t2.*, t3.* FROM term_relationships as t1 
INNER JOIN modules as t2 ON t2.module_id = t1.object_id
INNER JOIN t2.nextOfKinTable as t3 ON t3.module_id = t2.module_id;

Я думал об использовании information_schema, но слишком много писать, чтобы выполнить что-то, что может быть проще, просто поддерживая ссылку на таблицу, которую вы хотите соединить с текущим результатом соединения, только я не знаю, как заставить их присоединиться таким образом . Пожалуйста помоги :(

Редактировать:

  1. По сути, мы хотим объединить table1, table2 и table3 только в том случае, если имя для table3 является значением, хранящимся в table2.
  2. Общий столбец в этом случае — module_id (object_id)
  3. И неизвестная таблица t2.nextOfKinTable

person Ely De La Cruz    schedule 26.06.2011    source источник
comment
Привет, я не совсем понимаю, чего ты пытаешься достичь. Насколько я знаю, вы можете присоединиться только к другой таблице или переменной таблицы. Из вашего запроса я не вижу, какой таблице назначается псевдоним t3, и ваше второе соединение, похоже, ссылается на ту же таблицу в другом поле. Вы можете просто проверить оба поля в своем первом соединении с предложением AND.   -  person Isaac    schedule 26.06.2011


Ответы (2)


Попробуйте это

 declare @tabName varchar(1000)
 set @tabName = (select top 1 ProductName as tabName from products)

 declare @query varchar(8000)
 set @query = ' select
 p.ProductName as '''+@tabName+''' 
 from Products p'

---print(@query)
 exec (@query)
person Syeda    schedule 26.06.2011
comment
ой прямо сейчас я получаю вопрос. На самом деле это отличное решение, просто добавьте соединение к запросу и соедините переменную для имени таблицы. - person Isaac; 26.06.2011
comment
Вы говорите, что если я использую concat, мне будет разрешено использовать его результат в качестве имени таблицы в запросе? - person Ely De La Cruz; 26.06.2011
comment
О, я понимаю, что вы говорите. Позвольте мне попробовать это. - person Ely De La Cruz; 26.06.2011

В SQL нет стандартного способа сделать это. Подумайте, содержит ли ваша таблица t2 1000 строк, и каждая строка имеет отдельное значение nextOfKinTable. Это приведет к тому, что запрос превратится в соединение таблиц 1002. Не красиво. Я даже не знаю ни одного проприетарного синтаксиса, который поддерживал бы его в известных мне продуктах.

Если количество отдельных значений столбца невелико, вы можете использовать LEFT JOIN, но каждая объединенная таблица получит другой псевдоним (пример с использованием 3 таблиц):

SELECT
   t1.*, --TODO: List columns
   t2.*, --TODO: List columns
   COALESCE(t3.ColumnA,t4.ColumnA,t5.ColumnA) as ColumnA,
   COALESCE(t3.ColumnB,t4.ColumnB,t5.ColumnB) as ColumnB
FROM
    term_relationships as t1 
        INNER JOIN
    modules as t2
        ON
           t2.module_id = t1.object_id
        LEFT JOIN
    Table3 as t3
        ON
           t3.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table3'
        LEFT JOIN
    Table4 as t4
        ON
           t4.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table4'
        LEFT JOIN
    Table5 as t5
        ON
           t5.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table5'

Вы также можете подумать, должны ли эти отдельные таблицы быть одной таблицей с дополнительными столбцами, чтобы различать строки. Эту проблему иногда называют разделением атрибутов. (См. пример разделения таблицы Джо Селко в статье 2009 года)

person Damien_The_Unbeliever    schedule 26.06.2011
comment
Очень хороший ответ и справочная статья. Я проверяю статью Джо Селко прямо сейчас. - person Ely De La Cruz; 26.06.2011
comment
Спасибо, и я буду держать вас в курсе моих выводов по этому вопросу. - person Ely De La Cruz; 26.06.2011
comment
С другой стороны, причина установки, которую я пытаюсь установить, заключается в том, чтобы иметь столько разных типов модулей, сколько пользователь хочет иметь (простой модуль html, модуль меню, модуль баннера и т. д.), и поскольку все они имеют общие поля модуля. Я думаю, что имеет смысл иметь общие поля (около 20) в отдельной таблице, на которую они все ссылаются. Нет? - person Ely De La Cruz; 26.06.2011
comment
Я также понимаю, что вы говорите о 1000 результатов, но для модулей они никогда не превышают 100. Престижность за разборчивый sql! Безумно шикарный! Спасибо еще раз:) - person Ely De La Cruz; 26.06.2011