多个子查询条件或SQLite中的循环

问题描述

是否可以在单个SQL语句中执行类似于“ foreach”的查询?我的具体实现是使用SQLite,因此建议使用兼容语法的建议。

示例:假设我们有一个类似于以下内容的表:

simulation_id  |  sprite_id  |  time | x  |  y
1               1             0.0     0.0  0.0
1               2             0.0     5.5  1.6
1               1             1.0     0.1  0.0
1               2             1.0     5.5  1.5
1               3             1.0     9.9  4.1
1               1             2.0     ...
1               2             2.0
1               3             2.0
2               1             0.0
2               1             1.0
2               1             2.0
2               2             2.0
2               1             3.0
2               2             3.0
2               3             3.0
...

从表中得出的主要结论是,并非所有“ sprite_id”条目都可以在t = 0.0时实例化。

我想在所有实例中检索所有精灵的位置sprite_id = 3出现在 中。因此,我的理想查询是针对simulation_id = 1在t = 1.0时检索精灵1、2和3的位置,对于simulation_id = 2在t = 3.0时检索精灵的位置。

我相信查询内容大致如下:

SELECT simulation_id,sprite_id,time,x,y 
FROM locations WHERE time = (SELECT MIN(time) FROM locations WHERE sprite_id = 3)

...但是我需要为表中的每个Simulation_id运行此命令;甚至可以在单个SQL查询中做到这一点?

解决方法

您可以在WHERE子句中使用相关子查询:

SELECT l.*
FROM locations l
WHERE l.sprite_id = 3
AND time = (
  SELECT MIN(time) 
  FROM locations 
  WHERE simulation_id = l.simulation_id AND sprite_id = l.sprite_id
)

或使用ROW_NUMBER()窗口功能:

SELECT simulation_id,sprite_id,time,x,y
FROM (
  SELECT *,ROW_NUMBER() OVER (PARTITION BY simulation_id ORDER BY time) rn 
  FROM locations 
  WHERE sprite_id = 3
)
WHERE rn = 1

请参见demo
结果:

> simulation_id | sprite_id | time   | x    | y   
> ------------: | --------: | ---:   | :--- | :---
>             1 |         3 |    1.0 | .... | ....
>             2 |         3 |    3.0 | .... | ....

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...