Как сделать присоединиться к SQL на основе имени таблицы?

голоса
0

Итак, у нас есть куча таблиц, которые называются так:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005

А затем, чтобы найти те, которые мы смотрим на поле в другой таблице, давайте просто называть его master.training_type.

Во всяком случае, мне было интересно, если кто-нибудь знал способ сделать странное имя таблицы на основе присоединиться к такого рода данных. Что-то вроде этого:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id

Я знаю, что я могу сделать это на стороне клиента, но было бы неплохо иметь дб сделать это.

Кроме того, обратите внимание: это SQL Server.

Обновление : Я решил просто сделать это на стороне клиента. Спасибо в любом случае все.

Благодаря!

-fREW

Задан 09/12/2008 в 20:54
источник пользователем
На других языках...                            


5 ответов

голоса
2

Вы можете использовать только динамический SQL, чтобы прочитать master.training_type построить строку, которую затем выполнить с помощью EXEC (@stringvar)

Ответил 09/12/2008 в 20:57
источник пользователем

голоса
1

Распределяли вид является одним из возможных подходов. Так как вы только выбрать столбец Foo, вы на самом деле просто проверку на наличие строки в обучающей таблице с помощью INNER JOIN? Кроме того, похоже, что вы пытаетесь использовать Foo в качестве псевдонима в вашем присоединиться, но это не настроено таким образом в вашем ЗЕЬЕСТЕ. В результате я предполагаю, что здесь на то, что вы действительно хотите.

Другой вопрос ... есть множество учебных таблиц статическое? Вы ожидаете, чтобы иметь возможность добавить новую таблицу с новым номером суффиксов и это просто работа?

Другое возможное решение:

SELECT
     foo
FROM
     dbo.master m
WHERE
     (training_type = '001' AND EXISTS (SELECT * FROM dbo.training_data_001 WHERE foo_id = m.id)) OR
     (training_type = '002' AND EXISTS (SELECT * FROM dbo.training_data_002 WHERE foo_id = m.id)) OR
     (training_type = '003' AND EXISTS (SELECT * FROM dbo.training_data_003 WHERE foo_id = m.id)) OR
     (training_type = '004' AND EXISTS (SELECT * FROM dbo.training_data_004 WHERE foo_id = m.id)) OR
     (training_type = '005' AND EXISTS (SELECT * FROM dbo.training_data_005 WHERE foo_id = m.id))

Если вы действительно хотите, чтобы вернуться столбцы из таблиц с данными тренировки, то вы могли бы использовать что-то вроде:

SELECT
     m.id,
     COALESCE(t1.my_col, t2.my_col, t3.my_col, t4.my_col, t5.my_col) AS my_col
FROM
     dbo.master m
LEFT OUTER JOIN dbo.training_data_001 t1 ON m.training_type = '001' AND t1.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_002 t1 ON m.training_type = '002' AND t2.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_003 t1 ON m.training_type = '003' AND t3.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_004 t1 ON m.training_type = '004' AND t4.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_005 t1 ON m.training_type = '005' AND t5.foo_id = m.id
Ответил 09/12/2008 в 21:43
источник пользователем

голоса
1

сделать что-то вроде этого:

create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005

затем просто выбрать и присоединиться к / из него:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_all
ON foo.id = training_data_all.foo_id
WHERE training_data_all.training_type = ${master.training_type}

Если список таблицы будет расти / сокращаться с течением времени, вы можете написать эту же точку зрения динамически на основе таблиц, которые существуют, делая некоторые Lookups в системные таблицы.

Ничего из этого не является очень эффективным, хотя. Может вы просто ETL эти данные в объединенной таблице на некотором фиксированном интервале?

Ответил 09/12/2008 в 21:22
источник пользователем

голоса
1

Если таблицы вся та же структура, создать секционированное представление по таблицам и присоединиться к мнению. Вам нужно сделать проверочное ограничение на колонке (возможно, дату) , так что Оптимизатор запросов может сделать исключение раздела.

Ответил 09/12/2008 в 21:03
источник пользователем

голоса
1

Вы можете сделать это только с динамическим SQL в хранимую Proc. Вы также можете создавать представления или хранимые проки заранее с генерацией кода, если вы не хотите делать это на лету для безопасности или по другим причинам.

Ответил 09/12/2008 в 20:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more