Sql server 如果语句包含UNION运算符,则“按项目排序”必须显示在“选择”列表中吗?
一个sql脚本,它在生产服务器上运行很长一段时间都没有问题, 但如果 语句包含联合运算符“ 奇怪的是,sql脚本仍然可以在我的测试服务器中运行。所以我不知道 知道我所做的任何修订是否能在生产中正确运行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
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列提供了一个完全不同的别名,使其易于阅读,并减少了在查看代码时混淆的机会