sqlite 视图只在它应该产生许多结果时产生一个结果

时间:2021-02-23 19:19:04

标签: sqlite

我有一张桌子,里面装满了飞机变速箱。我的名为 active 的视图返回一个唯一标识符列表 (hex_ident) 并将它们放在列 d_active_hex 中。从这个视图中,我想将它与我的表连接起来,并返回包含每个活动 hex_ident 的 lat、lon、alt 数据的最新传输。我的活动视图工作正常,但是当我知道应该有多个时,我的第二个视图只返回一个条目,最多并包括但不一定是活动 hex_idents 的数量。这是请求。

cur.execute("""
            CREATE VIEW IF NOT EXISTS activepos AS
              SELECT hex_ident,max(parsed_time),lat,lon,altitude
              FROM squitters JOIN active
              ON squitters.hex_ident = active.d_hex_ident AND transmission_type = 3;
              

    """)

我目前正在将名为 active 的视图的结果添加到 python 中的列表中,然后循环遍历列表并对每个列表项发出单独的请求,如下所示

SELECT hex_ident,max(parsed_time),lat,lon,altitude
                                    FROM squitters
                                    WHERE hex_ident = ? AND transmission_type = 3

产生了预期的结果,但这似乎效率低下,我宁愿简化我的代码并同时学习如何在 sql 中执行此操作。弄乱它,似乎 max(parsed_time) 是问题,因为它从每次传输中选择最新的传输,而不是每个 hex_ident 的最新传输,但不确定如何实现我想要的。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我怀疑您想按 hex_ident 分组:

CREATE VIEW IF NOT EXISTS activepos AS
SELECT s.hex_ident, MAX(parsed_time) parsed_time, lat, lon, altitude
FROM squitters s JOIN active a
ON s.hex_ident = a.d_hex_ident 
WHERE transmission_type = 3
GROUP BY s.hex_ident

此外,您应该使用包含它们的表名/别名来限定所有列名。在我的代码中,我将无法识别表别名的所有列保留为不合格。