SQLite版本3.3.6
sqlite中有一个表
CREATE TABLE stats (Date TEXT , Sub TEXT , DELAY95TH INT ) ;
每行是:
Date |Sub|Delay
2012-06-25|212|750
2012-06-25|214|1180
2012-06-25|216|14902
任务是通过汇总的延迟
获取Sub来自Top 10的所有记录执行此操作的SQL:
Select
Date, Sub, Delay
from
stats
where
Sub in (select Sub
from stats
group by Sub
order by SUM(Delay) desc limit 10 ) ;
然而,它没有产生任何结果。只要删除“order by”子句,查询就会开始工作。
所以,例如:
select
Date, Sub, Delay
from
stats
where
Sub in (select Sub from stats group by Sub limit 10);
运作良好并产生预期的效果。
不止于此。在同一个实例中也有表:
CREATE TABLE data ( Date DATE , Sub INT, Subcont TEXT, Session INT, MsgType TEXT, Score INT);
并选择与有问题的相似,工作正常:
select
Subcont, MsgType, SUM(Score)
from
data
where
Subcont in (select Subcont
from data
group by Subcont
order by sum(Score) desc limit 10)
group by
Subcont, MsgType
order by
Subcont, MsgType;
它几乎相同:通过汇总分数识别前10个子级,并显示包含这些子级的所有记录。它工作!
答案 0 :(得分:1)
发现问题。
我不知道它是bug还是sqlite中的目的。 问题是“order by”在运行时在子查询中不起作用 与文本字段。
在Sub之后,TXT已经转换为INT,接下来的查询开始返回预期的结果:
Select Date, Sub , Delay from stats where Sub in (select Sub from stats group by Sub order by Sub) ;
Select Date, Sub , Delay from stats where Sub in (select Sub from stats group by Sub order by SUM(Delay) desc limit 10 ) ;
虽然Sub是TEXT,但这些查询没有返回任何内容。
唯一的问题仍然是:如果Sub内部有一些字母并将其转换为INT,那么解决方案应该是什么?
答案 1 :(得分:0)
如果我将“Date”列重命名为d1(DATE是SQL中的关键字),我会得到预期的(?)输出:
create table stats (d1 date, sub number, delay number);
insert into stats values('2012-06-25', 212, 750);
insert into stats values('2012-06-25', 214, 1180);
insert into stats values('2012-06-25', 216, 14902);
Select D1, Sub , Delay from stats where Sub in (
select Sub from stats group by Sub order by SUM(Delay) desc limit 10 ) ;
返回3行。 因此,只需重命名Date列并再试一次: - )