Sqlite:在子查询中排序“消除”结果

时间:2012-07-06 14:16:17

标签: sql sqlite

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个子级,并显示包含这些子级的所有记录。它工作!

2 个答案:

答案 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列并再试一次: - )