Можно ли использовать значение из вложенного подзапроса SQL для использования в качестве имени таблицы для охватывающего его запроса

#sql #sql-server

Вопрос:

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

Так что в теории

 SELECT doc.[DOC ID], doc.[PO Number], doc.[Supplier Coder], doc.[APPROVER DEPT], (SELECT [Approver] FROM {dat} WHERE {dat}.[DOC ID] == doc.[DOC ID]) FROM documents doc  

где имя таблицы {dat} будет представлять собой комбинацию строки «DEPT» и значения doc.[ОТДЕЛ УТВЕРЖДЕНИЯ]. Например, если запись возвращает 1 для поля ОТДЕЛА УТВЕРЖДАЮЩЕГО, я хотел бы получить значение поля Утверждающего, хранящегося в ОТДЕЛЕ 1, где совпадают идентификаторы документов.

Возможно ли достичь этого с помощью одной инструкции SQL? Я могу включить запрос в существующий код C# и предоставить решение таким образом, однако нужные операторы SQL будут использоваться для представлений и могут быть изменены третьими лицами, поэтому я бы предпочел предоставить решение только для SQL, если это возможно.

Комментарии:

1. Извините, да, я использую MS SQL Server.

2. Я не могу привести воспроизводимый пример, так как не уверен, что сам добьюсь результата. Мне просто интересно, возможно ли это и каким образом.

3. Это звучит как действительно плохой дизайн базы данных. Я подозреваю, что вам понадобится отдельная SELECT таблица для каждой возможной таблицы и UNION их вместе.

4. Вы можете достичь этого с помощью динамического SQL

5. К сожалению, дизайн базы данных является побочным эффектом использования OnBase и необходимостью извлечения данных из таблицы управления балансировкой нагрузки, которая ссылается на разные номера типов ключевых слов. Значения для каждого типа ключевого слова хранятся в отдельных таблицах, имена которых либо keyitem, либо keyxitem, с последующим указанием номера соответствующего типа ключевого слова. Так что да, это довольно ужасная система.

Ответ №1:

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

 SELECT doc.[DOC ID], doc.[PO Number], doc.[Supplier Coder], doc.[APPROVER DEPT], (select [Approver] from ( SELECT [Approver], 'DEPT1' as dept, [DOC ID] FROM DEPT1 union all SELECT [Approver], 'DEPT2' as dept, [DOC ID] FROM DEPT2 union all SELECT [Approver], 'DEPT3' as dept, [DOC ID] FROM DEPT3 ) s where s.[DOC ID] = doc.[DOC ID] and s.dept = doc.[APPROVER DEPT] )  FROM documents doc