SQL Соединение таблиц на основе списка имен

Я ищу способ присоединиться к серии таблиц SQL на основе списка имен таблиц. Список имен таблиц может изменяться по мере роста системы, но мне нужно убедиться, что объединение работает со всеми таблицами по мере их роста.

Каждая таблица в списке будет иметь общий столбец с именем ActivityID, который является внешним ключом к таблице Activity, которая является исходной таблицей объединения.

Я подумал, может быть, создать varchar и создать запрос перед выполнением. Это лучший способ или можно создать синтаксис объединения без построения varchar?

2 ответа

Решение

Я бы разместил запрос в представлении. При добавлении новой таблицы измените представление, чтобы включить новую таблицу. Это было бы намного эффективнее, чем динамический sql.

Если вы не контролируете, кто / когда добавляет таблицу, в Sql Server будет работать что-то вроде следующего динамического SQL:

declare @query nvarchar(max)
set @query = 'select * from t1 '

select  
    @query = @query + 'left join ' + name + 
        ' on t1.ActivityID = ' + name + '.ActivityID '
from sys.tables
where name like '%Activity%'

exec (@query)

С другой стороны, мне интересно, как вызывающая программа знает, какие поля ожидать.

Стандартный SQL не может этого сделать. Это обычно плохой дизайн в любом случае. У некоторых поставщиков есть расширения, которые позволяют это, как у Oracle EXECUTE IMMEDIATE в анонимных блоках PL/SQL.

Вам нужно либо создать оператор извне, либо использовать что-то вроде хранимой процедуры, чтобы создать оператор и выполнить его.

Другие вопросы по тегам