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. I
m 很高兴至少它有效。【参考方案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:在子查询“消除”结果中排序的主要内容,如果未能解决你的问题,请参考以下文章