我有一个场景,其中我必须创建一个视图,其中包含一堆由各种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中,更好的方法是什么?
2条答案
按热度按时间kuhbmx9i1#
我想你想要
CROSS APPLY
而不是UNION
. 我有点不清楚你想把逻辑放在哪里,但我的想法是:xkrw2x1b2#
当你使用
VIEW
,它是对数据库的1调用,而不管视图中有什么。因此,不需要使用临时表或表变量等,因此,您的原始查询在VIEW
这将是一个单一的sql调用。它的效率是另一个问题,我不能评论,因为完整的逻辑没有张贴在您的问题。然而,如果所有
JOIN
s和WHERE
所有条款SELECT
语句彼此相似/兼容,那么您可以将它们与CROSS APPLY
正如@gordon linoff所建议的,但我看到您提到的其中一个查询使用的是其他查询不共享的查找,因此这可能是可能的,也可能是不可能的(您的帖子缺少详细信息)。