【问题标题】:SELECT queries in a loopSELECT 循环中的查询
【发布时间】:2021-04-13 22:44:19
【问题描述】:

我正在开发一个 sqlite3 shell。

SELECT * FROM tasks WHERE name in ("TaskA", "TaskD") LIMIT 5;

上面的语句将只打印前 5 行。有没有办法编写此语句,以便打印“TaskA”和“TaskD”结果的前 5 行?

本质上,我正在尝试编写类似于以下内容的循环:

FOR task in ("TaskA", "TaskD") SELECT * FROM tasks WHERE name = task LIMIT 5;

但我不知道正确的语法。

【问题讨论】:

  • 也许只是UNION?
  • 嗨,斯坦西拉夫,我对 sqlite 很陌生。你能用UNION写一个详细的命令吗?

标签: sqlite


【解决方案1】:

使用ROW_NUMBER()窗口函数:

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY rowid) rn 
  FROM tasks 
  WHERE name IN ("TaskA", "TaskD")
)
WHERE rn <= 5

我使用列 rowid 来定义行的顺序。
如果您的表中有另一列(例如日期列)可用于定义顺序,您可以将rowid 替换为该列。

【讨论】:

  • 感谢@forpas,它工作正常!那么我们是否在右侧附加了一个rn 列?我在返回的结果中看到(1,2,3):TaskA__99914b932b|TaskA|pnl-z840-2|1 TaskA_None_d477ee5a96|TaskA|pnl-z840-2|2 TaskA__99914b932b|TaskA|pnl-z840-2|3 如果是,可以省略吗?
  • @tash 是的。而不是 SELECT * ... 写你想要返回的列的名称:SELECT column1, column2, ...
猜你喜欢
  • 2013-11-11
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多