Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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按自定义结果集列排序_Sql_Oracle - Fatal编程技术网

SQL按自定义结果集列排序

SQL按自定义结果集列排序,sql,oracle,Sql,Oracle,我正在尝试使用ORDERBY语句对多个union SELECT进行分组。(不是按组分组,而是可视分组) 考虑这一点: SELECT 'First Query' QRY, Field1, Field2 FROM Tabl1 WHERE Field1 <= 5 UNION ALL SELECT 'Second Query', Field1, Field2 FROM Tabl1 WHERE Field1 >5 ORDER BY QRY, Field1;

我正在尝试使用ORDERBY语句对多个union SELECT进行分组。(不是按组分组,而是可视分组)

考虑这一点:

SELECT 'First Query' QRY, Field1, Field2
    FROM Tabl1
    WHERE Field1 <= 5
UNION ALL
SELECT 'Second Query', Field1, Field2
    FROM Tabl1
    WHERE Field1 >5 
ORDER BY QRY, Field1;
选择'First Query'QRY,字段1,字段2
从表1
字段1和字段5在哪里
按QRY排序,字段1;
当我试图在oracle数据库上运行这样的查询时,我得到了
ORA-00904:“QRY”:无效标识符。我的语法有问题吗?是否需要使用每个UNION ALL限定列标识符?如果我不包括orderby,查询运行良好,结果集标题也正确

还是这根本不起作用


谢谢你的帮助,很抱歉问了这么一个琐碎的问题,但你不会相信这些东西对谷歌来说有多难。或者我就是不擅长。一种解决方案是只使用子查询:

SELECT t.*
FROM ((SELECT 'First Query' as QRY, Field1, Field2
       FROM Tabl1
       WHERE Field1 <= 5
      ) UNION ALL
      (SELECT 'Second Query', Field1, Field2
       FROM Tabl1
       WHERE Field1 > 5 
      )
     ) t
ORDER BY QRY, Field1;
实际上,qry的
顺序也没有必要。它是多余的,因为该值基于
字段1

select (case when field1 <= 5 then 'First Query' else 'Second Query' end) as qry,
        field1, field2
where field1 is not null
order by field1;

选择(如果字段1我是……你知道。谢谢。这是不正确的。如果ORDER BY出现在UNION ALL的末尾,则排序适用于UNION ALL的结果,而不是UNION ALL的第二个分支。如果你在末尾编写一个包含UNION ALL和ORDER BY的小查询,并查看解释计划-排序,你会清楚地看到这一点在这一点上,他是对的:就我而言,没有必要使用联合ALL。我已经重写了我的查询,它的性能大约提高了5倍,只有长度的八分之一。:@Wep0n-出于您的目的,这是可以的。但是,对于其他人来说,您的问题是关于“评估顺序”在ORDER BY和UNION ALL之间(没有使用“括号”,即子查询),Gordon给出了错误的答案。他现在纠正了这一点。首先,这个问题并非无关紧要(证据:你已经得到了两个错误的答案。)现在:完全按照所编写的查询应该完全按照您的预期执行:您不需要在UNION ALL的第二个分支中添加别名(如果添加别名,它们将被忽略),UNION ALL末尾的ORDER BY将应用于UNION ALL的结果,即使您不“使用括号”(您不将UNION ALL放在子查询中)。很可能您的实际查询与您在此处发布的查询不一样。我只是做了一些测试。我发现了一个问题(我觉得它像一个bug)-如果您有三个分支要联合所有分支,并且仅在第一个分支中提供别名,并在最后添加ORDER BY,则会出现您看到的错误。不知道原因。如果您将别名添加到第二个分支(但仍然不添加到第三个分支),查询工作正常。而且,即使别名仅出现在第一个分支上,
orderby1
也能正常工作。(尽管最好使用实际列名,而不是列号。)@mathguy这是我所假设的。我有几个联合体串在一起,只有第一列是完全限定的。奇怪的行为。@mathguy这可能值得再问一个问题,为什么会有这种行为。我也确认了。两个查询联合在一起,别名只在第一个查询上,别名按顺序工作。但是添加第三个没有别名的查询会中断。不过,我有一个偏好,那就是给每个查询添加别名。在调试过程中,单独提取每个查询是很有帮助的,这样它就有了自己的别名,这对运行它和理解它都很有帮助。@TheGrandDuke-我刚刚在OTN上发布了一些关于这方面的信息,并准备好了阅读回复:-)最好查看两个网站的输入;有许多优秀的贡献者只访问其中一个(SO和OTN)。
select (case when field1 <= 5 then 'First Query' else 'Second Query' end) as qry,
        field1, field2
where field1 is not null
order by field1;