Как мы можем получить значение столбца для использования в качестве имени таблицы для внутреннего соединения? - PullRequest
0 голосов
/ 26 июня 2011

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

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

Ответы [ 2 ]

1 голос
/ 26 июня 2011

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

Если число различных значений столбцов невелико, вы можете использовать ЛЕВЫЕ СОЕДИНЕНИЯ, но каждая объединенная таблица получитразные псевдонимы (например, с использованием 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 год )

1 голос
/ 26 июня 2011

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

 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)
...