Нет стандартного способа сделать это в 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 год )