SQLite3 "链式"查询
我需要从一个数据文件创建一个配置文件,数据文件的内容如下:
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 接口)。这个表有三列:Id
、Par
和 Val
;比如说,Id='MAN1'
,Par='RX'
,Val='123.45'
。
我想查询这个数据库,以获取与 'n' 个阶段相关的信息。用英语来说,就是:
"Select RX,RY,RZ for the next five legs starting on MAN1"
所以查询会从 MAN1
开始,获取 RX
、RY
、RZ
,然后读取参数 NEXT
,接着去那个 Id
,再获取 RX
、RY
、RZ
;再读取参数 NEXT
;然后再去下一个……这样重复五次。
我该如何使用“动态参数”来进行这样的查询呢?
谢谢。
2 个回答
根据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)提供了一个解决方法。
我在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