SQL Server-使用多个结果集中的行创建视图
鉴于以下问题SQL Server-使用多个结果集中的行创建视图,sql,sql-server,Sql,Sql Server,鉴于以下问题 Select Count(*) From TableA Select Count(*) From TableB Select Count(*) From TableC Select Count(*) From TableD 我想返回如下视图: ----------- | Counts | ----------- | 2 | --from TableA ----------- | 3 | --from TableB ---------- | 4
Select Count(*) From TableA
Select Count(*) From TableB
Select Count(*) From TableC
Select Count(*) From TableD
我想返回如下视图:
-----------
| Counts |
-----------
| 2 | --from TableA
-----------
| 3 | --from TableB
----------
| 4 | --from TableC
----------
| 5 | --from TableD
----------
我尝试使用UNION,例如:
CREATE VIEW [Foo]
AS
SELECT COUNT(*) AS [Counts]
FROM TableA
UNION
SELECT COUNT(*)
FROM TableB
UNION
SELECT COUNT(*)
FROM TableC
UNION
SELECT COUNT(*)
FROM TableD
但命令是错误的
-----------
| Counts |
-----------
| 2 | --from TableA
-----------
| 3 | --from TableB
----------
| 5 | --from TableD
----------
| 4 | --from TableC
----------
除了UNION之外,还有其他方法可以用来生成我想要的结果集吗?
UNION
内部为您进行排序,您需要UNION all
或定义显式排序:
SELECT COUNT(*) AS [Counts]
FROM TableA UNION ALL
SELECT COUNT(*)
FROM TableB UNION ALL
SELECT COUNT(*)
FROM TableC UNION ALL
SELECT COUNT(*)
FROM TableD;
您还可以定义显式排序:
SELECT COUNT(*) AS [Counts], 1 as SortOrder
FROM TableA UNION
SELECT COUNT(*), 2
FROM TableB UNION
SELECT COUNT(*), 3
FROM TableC UNION
SELECT COUNT(*), 4
FROM TableD;
因此,您需要在视图Foo
select f.*
from Foo f
order by SortOrder;
UNION
内部为您进行排序,您需要UNION all
或定义显式排序:
SELECT COUNT(*) AS [Counts]
FROM TableA UNION ALL
SELECT COUNT(*)
FROM TableB UNION ALL
SELECT COUNT(*)
FROM TableC UNION ALL
SELECT COUNT(*)
FROM TableD;
您还可以定义显式排序:
SELECT COUNT(*) AS [Counts], 1 as SortOrder
FROM TableA UNION
SELECT COUNT(*), 2
FROM TableB UNION
SELECT COUNT(*), 3
FROM TableC UNION
SELECT COUNT(*), 4
FROM TableD;
因此,您需要在视图Foo
select f.*
from Foo f
order by SortOrder;
非常接近,只需为订单添加一个派生字段
CREATE VIEW [Foo]
AS
SELECT TOP(100) PERCENT
*
FROM
(
SELECT COUNT(*) AS [Counts], RowOrder=1
FROM TableA
UNION
SELECT COUNT(*), 2
FROM TableB
UNION
SELECT COUNT(*), 3
FROM TableC
UNION
SELECT COUNT(*), 4
FROM TableD
)AS X
ORDER BY RowOrder
或-计数视图之外的订单
CREATE VIEW [Foo]
AS
SELECT
*
FROM
(
SELECT COUNT(*) AS [Counts], RowOrder=1
FROM TableA
UNION
SELECT COUNT(*), 2
FROM TableB
UNION
SELECT COUNT(*), 3
FROM TableC
UNION
SELECT COUNT(*), 4
FROM TableD
)AS X
...
SELECT * FROM Foo ORDER BY RowOrder
非常接近,只需为订单添加一个派生字段
CREATE VIEW [Foo]
AS
SELECT TOP(100) PERCENT
*
FROM
(
SELECT COUNT(*) AS [Counts], RowOrder=1
FROM TableA
UNION
SELECT COUNT(*), 2
FROM TableB
UNION
SELECT COUNT(*), 3
FROM TableC
UNION
SELECT COUNT(*), 4
FROM TableD
)AS X
ORDER BY RowOrder
或-计数视图之外的订单
CREATE VIEW [Foo]
AS
SELECT
*
FROM
(
SELECT COUNT(*) AS [Counts], RowOrder=1
FROM TableA
UNION
SELECT COUNT(*), 2
FROM TableB
UNION
SELECT COUNT(*), 3
FROM TableC
UNION
SELECT COUNT(*), 4
FROM TableD
)AS X
...
SELECT * FROM Foo ORDER BY RowOrder
视图返回无序的结果集。您可以尝试执行以下操作:
create view v_counts as
select . . .
order by . . .
您将得到错误消息:
ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML
正如这条信息所暗示的,有一种作弊的方法可以绕过这个问题,但我建议不要这样做——即使你作弊,视图也不能保证按顺序返回结果
而是包括表名:
Select 'TableA' as which, Count(*) From TableA
union all
Select 'TableB' as which, Count(*) From TableB
union all
Select 'TableC' as which, Count(*) From TableC
union all
Select 'TableD' as which, Count(*) From TableD;
视图返回无序的结果集。您可以尝试执行以下操作:
create view v_counts as
select . . .
order by . . .
您将得到错误消息:
ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML
正如这条信息所暗示的,有一种作弊的方法可以绕过这个问题,但我建议不要这样做——即使你作弊,视图也不能保证按顺序返回结果
而是包括表名:
Select 'TableA' as which, Count(*) From TableA
union all
Select 'TableB' as which, Count(*) From TableB
union all
Select 'TableC' as which, Count(*) From TableC
union all
Select 'TableD' as which, Count(*) From TableD;
您是否使用顺序来确定每个计数来自哪个表?我希望顺序是从A到D,我只是好奇为什么。通常情况下,最好不要依赖视图进行排序。为什么不包括表名,以便了解结果集的含义?是否使用顺序来标识每个计数来自哪个表?我希望顺序从a到D,我只是好奇为什么。通常情况下,最好不要依赖视图进行排序。为什么不包括表名,这样您就知道结果集的含义了?非常感谢,所有这些都不能保证顺序。事实上,这与秩序无关。UNION仅返回不同的行,其中UNION ALL返回所有行。只有一种方法可以确保顺序,即在最终查询中使用order BY语句。UNION ALL将返回重复项。如果不需要重复项怎么办?除非还指定了top,否则不能在视图中放置order by。在视图中,不能保证在最终select语句中按该顺序返回。如果您有两个“有序”的视图,并且排序逻辑相互冲突,会发生什么情况?@JeffOrris您在本例中指的是什么重复项?非常感谢,所有这些都不能保证顺序。事实上,这与秩序无关。UNION仅返回不同的行,其中UNION ALL返回所有行。只有一种方法可以确保顺序,即在最终查询中使用order BY语句。UNION ALL将返回重复项。如果不需要重复项怎么办?除非还指定了top,否则不能在视图中放置order by。在视图中,不能保证在最终select语句中按该顺序返回。如果您有两个“有序”的视图,且排序逻辑相互冲突,会发生什么情况?@JeffOrris您在本例中指的是什么重复项?感谢您的回答视图中的Order by没有意义,如果不指定top,则无法执行。确保结果集中的顺序的唯一方法是在最终select语句中使用ORDERBY。顺便说一句,按顺序排序通常被认为是个坏主意!你是对的,你需要一个通常不使用的100%的顶部。阿洛斯,我让我的速记从快速脚本习惯中得到了最好的发挥,谢谢肖恩·兰格。谢谢你的回答。在一个视图中,Order by毫无意义,如果不指定top,这是不可能的。确保结果集中的顺序的唯一方法是在最终select语句中使用ORDERBY。顺便说一句,按顺序排序通常被认为是个坏主意!你是对的,你需要一个通常不使用的100%的顶部。阿洛斯,我让我的速记从快速脚本习惯中得到了最好的发挥,谢谢肖恩·兰格。