#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