如何阻止SQL查询在Oracle中自我排序?

时间:2017-09-18 10:34:04

标签: sql oracle sorting union

我写了一个简单的查询,以下列格式给出结果:

  Language
 _________
    ar
    en
    sb

问题是我没有应用任何排序顺序,但它仍然按字母顺序按升序排序结果。我该怎么办呢?

这是我的查询,

 SELECT * 
 FROM
 (
   SELECT template_lang_code AS "LANGUAGE_CODE" 
   FROM iris_cms.product_service_alerts 
   WHERE productid = '102161' 
   AND service_code = '6' 
   AND  template_lang_code = (SELECT paramvalue AS "LANGUAGE_CODE" 
                              FROM IRIS_CMS.tblcustomerdetail 
                              WHERE customerid = '6435635354' 
                              AND paramid = (SELECT entity_id 
                                             FROM IRIS_CMS.tblcfgdynamiccustomerform 
                                             WHERE control_id = 'LANGUAGE_CODE') 
                             AND paramvalue != '-1')
   UNION
   SELECT language_code 
   FROM iris_config.alert_template 
   WHERE template_id = (SELECT template_id 
                        FROM IRIS_CMS.product_service_alerts 
                        WHERE productid = '102161' 
                          AND service_code = '6' AND is_default = '1')
 )
 fetch FIRST 1 ROW ONLY;

我希望结果按查询顺序排列,如果union中的第一行有一个值,它应该在顶部,依此类推。

3 个答案:

答案 0 :(得分:3)

未指定order by时获得的顺序是不确定的。特别是与fetch first rows一起,您应该始终指定order by

如果要为联合的每个部分提供不同的“优先级”,可以通过添加可用于排序的列来实现:

SELECT language_code
FROM
(
 SELECT template_lang_code AS "LANGUAGE_CODE", 
        1 as sort_order --<< HERE
 FROM ...
 UNION ALL
 SELECT language_code, 
        2   --<< HERE
 FROM ...
)
ORDER BY sort_order, language_code
FETCH FIRST 1 ROW ONLY;

这将从顶部的union的第一部分开始排序。第一部分中具有相同language_code的行将按字母顺序排序。 union的第二部分中的所有行都将出现在第一部分的行之后。

答案 1 :(得分:0)

看看你的问题,似乎你希望结果是随机顺序而不是按字母顺序排序。

您可以使用以下Order By语句,该语句将按内存中每行的全局唯一标识符(GUID)排序,因此将完全无序。

SELECT * FROM table ORDER BY NEWID()

如果有帮助请告诉我

答案 2 :(得分:0)

根据我的评论。从本质上讲,由于只需要一行,因此并不是必需的。联合的第二部分可以简化为逻辑条件。并且......排序问题已不再适用。

 SELECT * 
 FROM
 (
     SELECT template_lang_code AS "LANGUAGE_CODE" 
     FROM iris_cms.product_service_alerts 
     WHERE productid = '102161' 
         AND service_code = '6' 
         AND (template_lang_code = (SELECT paramvalue AS "LANGUAGE_CODE" 
                          FROM IRIS_CMS.tblcustomerdetail 
                          WHERE customerid = '6435635354' 
                          AND paramid = (SELECT entity_id 
                                         FROM IRIS_CMS.tblcfgdynamiccustomerform 
                                         WHERE control_id = 'LANGUAGE_CODE') 
                         AND paramvalue != '-1')
              OR is_default = '1')
 )
 fetch FIRST 1 ROW ONLY;