Разделенное представление - один из возможных подходов. Поскольку вы выбираете только столбец foo, действительно ли вы просто проверяете наличие строки в таблице тренировок через INNER JOIN? Кроме того, похоже, что вы пытаетесь использовать foo в качестве псевдонима в своем соединении, но в предложении SELECT это не настроено таким образом В результате я думаю, что вы действительно хотите.
Еще один вопрос ... статичен ли набор тренировочных столов? Вы ожидаете, что сможете добавить новую таблицу с новым номером суффикса и она будет работать?
Другое возможное решение:
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