按术语排序不在结果集中

时间:2013-10-09 09:06:58

标签: android sqlite union android-sqlite

我在SQLite中执行查询时遇到以下错误:

4th ORDER BY term does not match any column in the result set

我的查询:

select * from Users where deleted != 1 AND  DATE(created) <= '2013-10-09' and 
DATE(created) >= '2013-09-09T12:41:55.261Z' UNION select * from Users where deleted != 1 AND 
owner NOT IN(Select userid from Customer) 
order by Type DESC,License ASC,NUM ASC,"MCTD#" ASC,Name DESC;

然而,单个查询的等价物,即没有UNION 的似乎可行 细

是否存在 ORDER BY 条款必须包含在结果中的限制 组?如果是这样的话,如果没有 UNION ,为什么不这样做呢?

我曾经从用户中选择所有,因此它应该从User表中获取所有列。那为什么这个例外?

2 个答案:

答案 0 :(得分:2)

如果列的名称为MCTD%23,则必须使用该名称来引用该列。 %转义是HTTP协议的一项功能,不在SQL中使用。

"MCTD#"似乎在没有UNION的情况下工作的原因是它实际上并不引用列。如果不使用UNION,则可以在ORDER BY子句中使用任意表达式。如果找不到引用的列名,那么为了与MySql兼容,"MCTD#"被解释为'MCTD#',这只是一个实际上不影响排序的常量字符串值。

对于UNIONORDER BY不允许任意表达式,只允许结果集中的实际列名,因此无法将"MCTD#"解释为字符串值。

答案 1 :(得分:0)

2017更新:如果您将UNIONed查询包装在另一个选择中,则可以在ORDER BY中使用计算值:

select * from (
    <query1>
    UNION
    <query2>
    UNION
    <etc...>
)
order by <calculated expression>