在sql server的视图中使用临时表/临时变量或cte的替代方法

tquggr8v  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(557)

我有一个场景,其中我必须创建一个视图,其中包含一堆由各种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

我尝试使用临时variable&temp表来避免对数据库进行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。
在SQLServer中,更好的方法是什么?

kuhbmx9i

kuhbmx9i1#

我想你想要 CROSS APPLY 而不是 UNION . 我有点不清楚你想把逻辑放在哪里,但我的想法是:

SELECT DISTINCT v.Id, 
       (COALESCE(FIRST_NAME, 'unknown') + ':' + 'Unknown') AS label,
       COALESCE(VALUE,'unknown') AS [value]
FROM #tempTable CROSS APPLY
     (VALUES (COALESCE(ID, 'ID')),
             (COALESCE(EMP_ID, 'ID')),
             (COALESCE(LICENCE_ID, 'ID')),
             . . .
     ) v(id)
xkrw2x1b

xkrw2x1b2#

当你使用 VIEW ,它是对数据库的1调用,而不管视图中有什么。因此,不需要使用临时表或表变量等,因此,您的原始查询在 VIEW 这将是一个单一的sql调用。

CREATE VIEW [test].[emp].[MainView]
AS
SELECT .... FROM [test].[emp].[OrgView]
UNION
SELECT .... FROM [test].[emp].[OrgView]
....

它的效率是另一个问题,我不能评论,因为完整的逻辑没有张贴在您的问题。然而,如果所有 JOIN s和 WHERE 所有条款 SELECT 语句彼此相似/兼容,那么您可以将它们与 CROSS APPLY 正如@gordon linoff所建议的,但我看到您提到的其中一个查询使用的是其他查询不共享的查找,因此这可能是可能的,也可能是不可能的(您的帖子缺少详细信息)。

相关问题