У меня есть сценарий, в котором мне нужно создать представление с кучей UNIONS различных операторов select.
SELECT DISTINCT ISNULL(ID,'ID') as Id,
ISNULL(FIRST_NAME,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM [test].[emp].[OrgView]
UNION
SELECT DISTINCT ISNULL(EMP_ID,'ID') as Id,
ISNULL(LAST_NAME,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM [test].[emp].[OrgView]
UNION
SELECT DISTINCT ISNULL(LICENSE,'ID') as Id,
ISNULL(COMPANY,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM [test].[emp].[OrgView]
.
.
.
.
.
10 such selects
Я пытаюсь использовать временные переменные и временные таблицы, чтобы избежать 10 различных обращений к базе данных, но похоже, что они не работают в представлении, как показано ниже.
Create View [test].[emp].[MainView]
AS
select * into #tempTable from [test].[emp].[OrgView]
SELECT DISTINCT ISNULL(ID,'ID') as Id,
ISNULL(FIRST_NAME,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM #tempTable
UNION
SELECT DISTINCT ISNULL(EMP_ID,'ID') as Id,
ISNULL(LAST_NAME,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM #tempTable
UNION
SELECT DISTINCT ISNULL(LICENSE,'ID') as Id,
ISNULL(COMPANY,'unknown') + ':' + 'Unknown' AS label,
ISNULL(VALUE,'unknown') AS [value]
FROM #tempTable
Невозможно использовать общее табличное выражение (CTE) с вышеуказанным запросом, так как он будет доступен только для одного поиска, а не для остальных 9.
Как лучше всего это сделать на сервере Sql?
UNION
иUNION ALL
. - person SMor   schedule 05.08.2020'ID', 'unknown:Unknown', 'unknown'
к набору результатов для строк, в которых отсутствуют значения. Это только усложняет работу движка — рассмотрите возможность исключения этих значений изWHERE
(удалениеISNULL
) и добавление их обратно с новыми запросами, если это необходимо (т. е. инвертированиеWHERE
). Оптимизатор может распознать, когда подзапросы имеют условия, которые логически исключают друг друга, но он не может оптимизироватьDISTINCT
над выражениями. Это, вероятно, также позволит вам использоватьUNION ALL
, а неUNION
. - person Jeroen Mostert   schedule 05.08.2020