Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-使用多个结果集中的行创建视图_Sql_Sql Server - Fatal编程技术网

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%的顶部。阿洛斯,我让我的速记从快速脚本习惯中得到了最好的发挥,谢谢肖恩·兰格。