Вот пример модели "стандартный тип / подтип", отмеченной @Philip Kelley выше:
У вас есть
SupertypeType. Таблица доменов, ограничивающая домен идентификатора типа.
Supertype. Общий супертип.В этой таблице существует строка для каждого экземпляра одного из экземпляров подтипа.Он содержит идентификатор объекта (SupertypeID), идентификатор типа объекта (TypeID) и атрибуты, общие для всех подтипов.
Подтип. Таблица существует для каждогоподтип.Его первичный ключ - это идентификатор объекта таблицы супертипа.Для каждого экземпляра супертипа во всех таблицах подтипов существует не более одной строки (конечно, может не быть строк, если рассматриваемый экземпляр относится к базовому (супер) типу. Каждая таблица подтипа различается и содержит атрибуты.уникальны для этого конкретного подтипа.
Чтобы перечислить все элементы, запросите только таблицу супертипа.
Если вы знаете, что интересуетесь только определенным подтипом, выможет просто выбрать из соответствующей таблицы подтипов, при необходимости объединяясь с таблицей супертипов, чтобы получить любые общие атрибуты, которые вам нужны.
Приложение. Если вам нужен плоский, денормализованный вид всего наборапросто оставьте соединение между подтипами:
select *
from Supertype t
left join Subtype1 t1 on t1.SupertypeID = t.SupertypeID
left join Subtype2 t2 on t2.SupertypeID = t.SupertypeID
left join Subtype3 t3 on t3.SupertypeID = t.SupertypeID
Теперь вам не нужно многократные запросы. Вы обменяли это на необходимость иметь дело с нулем.