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

Posted

技术标签:

【中文标题】Sqlite:在子查询“消除”结果中排序【英文标题】:Sqlite: order by in subquery "eliminates" results 【发布时间】:2012-07-06 14:16:16 【问题描述】:

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

任务是通过汇总Delay获取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; 

它的作用几乎相同:通过汇总 Score 识别前 10 个 Subcont,并显示包含这些 Subcont 的所有记录。而且它有效!

【问题讨论】:

在您的第一个查询中,您有 ... where sub in (select sub ..);在您的第二个查询中,您有 ... where subm in (select subm ...)。这些只是拼写错误,还是您真的有两个不同的列名为 sub 和 subm? 这些是拼写错误。感谢您指出!现在将修复。 limit 子句在子查询 sqlite 中不起作用 【参考方案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,应该如何解决?

【讨论】:

我无法重现这个(但是使用 SQLite3 版本 3.7.5)。对我来说,这两个查询都按预期工作。您是否 100% 确定您在其他地方没有错误?您是否尝试过使用全新的 SQLite3 数据库? 是的,弗兰克。 Fresh DB 每次运行脚本。每次启动脚本时都会执行“如果存在则删除”和“创建表”。可能由于 sqlite3 版本不同,您无法重现。我m to lazy to check change notes from 3.3.6 to 3.7.5. Im 很高兴至少它有效。【参考方案2】:

如果我将“日期”列重命名为 d1(日期是 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 行。 所以,只需重命名您的日期列并重试:-)

【讨论】:

试过这个,不幸的是没有运气。我也可以做 Select Sub , Delay from stats ......它仍然没有提供任何东西。

以上是关于Sqlite:在子查询“消除”结果中排序的主要内容,如果未能解决你的问题,请参考以下文章

在子查询和别名中排序

在子查询中排序

如何在子查询中使用外部查询中的列从另一个表中获取结果?

SQL 子查询练习

Oracle 分页查询在子查询中使用了 排序和like 会影响效率吗? 怎样优化呢

如何在子查询结果中找到记录,其中项目的结果为假且没有结果为真?