Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 如果语句包含UNION运算符,则“按项目排序”必须显示在“选择”列表中吗?_Sql Server - Fatal编程技术网

Sql server 如果语句包含UNION运算符,则“按项目排序”必须显示在“选择”列表中吗?

Sql server 如果语句包含UNION运算符,则“按项目排序”必须显示在“选择”列表中吗?,sql-server,Sql Server,一个sql脚本,它在生产服务器上运行很长一段时间都没有问题, 但如果 语句包含联合运算符“ 奇怪的是,sql脚本仍然可以在我的测试服务器中运行。所以我不知道 知道我所做的任何修订是否能在生产中正确运行 SELECT '' as value ,'Outstanding' as text , 0 as disp_order union select a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order FRO

一个sql脚本,它在生产服务器上运行很长一段时间都没有问题, 但如果 语句包含联合运算符“

奇怪的是,sql脚本仍然可以在我的测试服务器中运行。所以我不知道 知道我所做的任何修订是否能在生产中正确运行

SELECT '' as value ,'Outstanding' as text , 0 as disp_order
union
select a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order
FROM   rfq_buyer_status_v a WITH (NOLOCK)
ORDER BY a.disp_order
试试这个:

select * from 
(
SELECT '' as value ,'Outstanding' as text , 0 as disp_order
union
select a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order
FROM   rfq_buyer_status_v a WITH (NOLOCK)
) t

ORDER BY t.disp_order

SQL server按以下阶段的顺序分析查询:

来源->地点->分组依据->拥有->选择->订购依据

每个阶段操作一个或多个表作为输入,并返回一个虚拟表作为输出。 一个阶段的输出表被视为下一阶段的输入。这与产生关系的关系上的操作是一致的。如果指定了ORDER BY,则结果 这不是关系

在早期阶段中定义的任何别名都可以通过其后面的阶段看到,但反之亦然

e、 g

下面的查询是可以的

SELECT [Col_1], [Col_2] 
FROM Table_A AS A 
WHERE A.[Col_1] > 0
ORDER BY A.[Col_2]; 
而这个是行不通的

SELECT [Col_1] AS C1, [Col_2] AS C2 
FROM Table_A 
WHERE C1 > 0
ORDER BY C2; 
现在,, UNION set运算符统一两个输入查询的结果。作为一个集合运算符,UNION有一个隐含的DISTINCT属性,这意味着它不会返回重复的行

如果在查询中使用UNION,它会将两个集合合并为一个集合,并且ORDER BY将对组合的集合生效,而不仅仅是对SELECT。。。从…起数据集。 原因是ORDER BY是队列中最弱的(或最后一个),它“捕获所有”

在查询的第一行中,您给了0一个名为“disp_order”的别名,这很好。在使用UNION运算符之后,您从表“rfq\U buyer\U status\U v”查询了一个数据集,其中包含一个名为“disp\U order”的列,这也是可以接受的。问题是在接到订单后出现的

由于您还为该表提供了一个别名,即“a”,ORDER BY a.disp_ORDER意味着限制组合数据集部分的排序操作,这与“捕获所有”活动冲突

解决办法是删除ORDER BY子句后面的“a.”。可以这样做的原因是,您为0提供了别名“disp_order”,该别名与表rfq_buyer_status_v中的列名相同。在这种情况下,我看不到为表添加别名的任何价值

SELECT '' AS value ,'Outstanding' AS text , 0 AS disp_order
UNION 
SELECT a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order
FROM   rfq_buyer_status_v a WITH (NOLOCK)
ORDER BY disp_order
另一种编写查询的方法是

SELECT ''            AS value ,
       'Outstanding' AS text  , 
       0             AS ABC
UNION 
SELECT buyer_status_code AS value , 
       buyer_status_name AS text ,
       disp_order        AS ABC
FROM   rfq_buyer_status_v 
    WITH (NOLOCK)
ORDER BY ABC
第二个为disp_order列提供了一个完全不同的别名,使其易于阅读,并减少了在查看代码时混淆的机会