【问题标题】:Multiple subquery criteria or looping in SQLiteSQLite 中的多个子查询条件或循环
【发布时间】:2020-08-14 01:59:22
【问题描述】:

是否可以在单个 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 的第一个实例中检索所有精灵的位置。因此,我的理想查询将检索 sprite 1、2 和 3 在 t=1.0 时的位置(simulation_id=1)和 t=3.0 时的 Simulation_id=2。

我相信查询会是这样的:

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

...但是我需要对表中的每个 Simulation_id 进行此运行;这甚至可以在单个 SQL 查询中实现吗?

【问题讨论】:

    标签: sql sqlite subquery


    【解决方案1】:

    您可以在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 | .... | ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多