我写了一个简单的查询,以下列格式给出结果:
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中的第一行有一个值,它应该在顶部,依此类推。
答案 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;