一个sql脚本,它在生产服务器上运行很长时间没有问题,但是最近的系统报告"ORDER BY items如果语句包含一个UNION运算符,必须出现在选择列表中"
奇怪的是,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
Run Code Online (Sandbox Code Playgroud)
Ana*_*dke 30
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
小智 19
SQL Server按阶段顺序解析查询,如下所示:
FROM - > WHERE - > GROUP BY - > HAVING - > SELECT - > ORDER BY
每个阶段作为输入在一个或多个表上运行,并返回虚拟表作为输出.一个阶段的输出表被视为下一阶段的输入.这与产生关系的关系的操作是一致的.如果指定了ORDER BY,则结果不是关系的.
在早期阶段中定义的任何别名都可以在其后的阶段中看到,但反之亦然.
例如
以下查询是可以的
SELECT [Col_1], [Col_2]
FROM Table_A AS A
WHERE A.[Col_1] > 0
ORDER BY A.[Col_2];
Run Code Online (Sandbox Code Playgroud)
虽然这个不会起作用
SELECT [Col_1] AS C1, [Col_2] AS C2
FROM Table_A
WHERE C1 > 0
ORDER BY C2;
Run Code Online (Sandbox Code Playgroud)
现在,UNION集合运算符统一了两个输入查询的结果.作为集合运算符,UNION具有隐含的DISTINCT属性,这意味着它不会返回重复的行.
如果在查询中使用了UNION,它会将两个集合合为一个,并且ORDER BY将对组合集生效,而不仅仅在SELECT ... FROM ...数据集上生效.原因是ORDER BY是队列中最弱的(或最后一个)并且它'捕获全部'
在查询的第一行,您给出了一个名为"disp_order"的别名,这很好.在UNION运算符之后,您从表'rfq_buyer_status_v'查询了一个数据集,其中包含一个名为'disp_order'的列,这也是完全可以接受的.问题来自ORDER BY之后.
由于您还为表提供了别名,即"a",因此ORDER BY a.disp_order意味着限制对部分合并数据集的排序操作,该操作与"全部捕获"活动冲突.
解决方案是删除'a'.在ORDER BY子句之后.您可以这样做的原因是您给了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
Run Code Online (Sandbox Code Playgroud)
另一种编写查询的方法是
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
Run Code Online (Sandbox Code Playgroud)
第二个为disp_order列提供了一个完全不同的别名,使其易于阅读,并减少了在查看代码时感到困惑的可能性.