SQLite3 "链式"查询

0 投票
2 回答
1464 浏览
提问于 2025-04-15 16:56

我需要从一个数据文件创建一个配置文件,数据文件的内容如下:

MAN1_TIME '01-JAN-2010 00:00:00.0000 UTC'
MAN1_RX 123.45
MAN1_RY 123.45
MAN1_RZ 123.45
MAN1_NEXT 'MAN2'
MAN2_TIME '01-MAR-2010 00:00:00.0000 UTC'
MAN2_RX 123.45
[...]
MAN2_NEXT 'MANX'
[...]
MANX_TIME [...]

这个文件描述了一个轨迹的不同“阶段”。在这个例子中,MAN1 连接着 MAN2,而 MAN2 又连接着 MANX。在原始文件中,这些连接并不是很明显(也就是说,它们不是按顺序排列的)。

我已经成功地读取了这个文件,并把数据存储到了一个 Sqlite3 数据库中(我使用的是 Python 接口)。这个表有三列:IdParVal;比如说,Id='MAN1'Par='RX'Val='123.45'

我想查询这个数据库,以获取与 'n' 个阶段相关的信息。用英语来说,就是:

"Select RX,RY,RZ for the next five legs starting on MAN1"

所以查询会从 MAN1 开始,获取 RXRYRZ,然后读取参数 NEXT,接着去那个 Id,再获取 RXRYRZ;再读取参数 NEXT;然后再去下一个……这样重复五次。

我该如何使用“动态参数”来进行这样的查询呢?

谢谢。

2 个回答

0

根据OMG Ponies的评论,以及http://sqllessons.com/categories.html,你可以试试下面这样的写法:

select 
       MAN1.RX as MAN1_RX,
       MAN1.RY as MAN1_RY,
       MAN1.RZ  as MAN1_RZ,
       MAN2.RX as MAN2_RX,
       MAN2.RY as MAN2_RY,
       MAN2.RZ  as MAN2_RZ,
       MAN3.RX as MAN3_RX,
       MAN3.RY as MAN3_RY,
       MAN3.RZ  as MAN3_RZ,
  from table as MAN1
left outer
  join table as MAN2
    on MAN1.NEXT = MAN2.Id
left outer
  join table as MAN3
    on MAN3.NEXT = MAN2.Id
where MAN1.Id = 'MAN1'

另外,我对sqlite不是特别熟悉,但假设它没有直接的层次查询语法,那么这个链接(http://www.dbforums.com/mysql/1638233-equivalent-start-connect-mysql.html)提供了一个解决方法。

1

我在SQLAlchemy网站上找到了自己问题的答案。根据文档的说明:

邻接列表模式是一种常见的关系模式,它的特点是一个表中包含对自身的外键引用。这是用平面表格表示层级数据最常见和简单的方法。另一种方法是“嵌套集合”模型,有时也叫“修改后的前序”。尽管许多网上文章提到修改后的前序,但邻接列表模型可能是大多数层级存储需求中最合适的模式,因为它在并发性、复杂性降低方面表现更好,而且修改后的前序对能够完全加载子树的应用程序几乎没有优势。

在SQLAlchemy中,邻接列表关系通常被称为自引用映射器。在这个例子中,我们将使用一个名为treenodes的单一表来表示树结构:

像下面这样的图:

root --+---> child1
       +---> child2 --+--> subchild1
       |              +--> subchild2
       +---> child3

将用如下数据表示:

id       parent_id     data
---      -------       ----
1        NULL          root
2        1             child1
3        1             child2
4        3             subchild1
5        3             subchild2
6        1             child3

撰写回答