SQLite子查询可以包含ORDER BY吗?

时间:2020-06-06 13:53:34

标签: sql sqlite join sql-subselect

我有以下SQL语句,用于选择讨论论坛主题以及相关的信息,这些信息包括有关第一条/最后一条帖子,帖子数量以及发起该帖子的用户的信息:

SELECT forum_threads.*, 
       users.displayname as cc_username, 
       coalesce(count(forum_posts.id),0) AS cc_postCount,
       (select id from forum_posts where threadId=forum_threads.id order by tsCreate asc limit 1) as cc_firstPostId,
       (select id from forum_posts where threadId=forum_threads.id order by tsCreate desc limit 1) as cc_lastPostId,
       (select tsCreate from forum_posts where threadId=forum_threads.id order by tsCreate desc limit 1) as cc_tsLatest
FROM forum_threads
LEFT JOIN forum_posts ON forum_posts.threadId = forum_threads.id
LEFT JOIN users ON users.id = forum_threads.userId
GROUP BY forum_threads.id
ORDER BY forum_posts.tsCreate DESC

它似乎工作正常,但我只是在Tutorialspoint上读到SQLite子查询不能包含ORDER BY。我的工作,他们工作。

它们如何工作?我是否很幸运,应该以其他方式构造查询吗?

1 个答案:

答案 0 :(得分:1)

您生成的子查询的类型在SQL中称为标量子查询。这是一个子查询,返回一列,最多一行。它计算单个值,例如可以在selectwhere子句中使用。

documentation for expressions描述了标量子查询:

子查询表达式

。 。 。

返回单列的子查询是标量子查询,可以在大多数地方使用。返回两列或更多列的子查询是行值子查询,只能用作比较运算符的操作数。

在使用order by方面没有区别。

实际上,您的子查询类型实际上是与标量相关的子查询,但是适用相同的推理。

我应该注意,SQLite中表达式的语法图似乎缺少标量子查询。因此,文档对此进行了说明。我认为这是文档中的错误。

尽管您可以使用教程作为指导,但是如果您真的想知道数据库的功能,请查看该数据库的文档。

相关问题