【问题标题】:Sqlite3 "chained" querySqlite3“链式”查询
【发布时间】:2009-12-12 03:00:26
【问题描述】:

我需要从如下所示的数据文件创建配置文件:

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;去那个……像这样五次。

如何使用“动态参数”传递此类查询?

谢谢。

【问题讨论】:

  • 你所描述的对我来说听起来像是一个分层查询。
  • @OMG Ponies:+1:我寻找“分层”查询,看来,确实,这就是我正在寻找的。现在......我该怎么做呢:) 同时我正在记录自己......
  • 我敢问,但你一定要使用 SQLite 吗? Oracle 和 SQL Server 都有免费版本,两者都有分层查询语法。
  • 我愿意。我无法在我们的网络中安装任何依赖于服务器的数据库。
  • 您可以对该数据文件进行一些处理,然后创建不同类型的数据库架构吗?

标签: python sql sqlite


【解决方案1】:

我在SQLAlchemy website 中找到了我自己问题的答案。来自文档:

邻接表模式是一种常见的 关系模式,其中一个表 包含一个外键引用 本身。这是最常见和最 表示层次结构的简单方法 平面表中的数据。另一种方式是 “嵌套集”模型,有时 称为“修改预购”。尽管 许多在线文章说什么 修改前序,邻接表 模型可能是最合适的 模式为绝大多数 分层存储需求,用于 并发的原因,减少 复杂性,以及修改后的预购 与一个相比没有什么优势 可以完全加载的应用程序 子树进入应用程序空间。

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

【讨论】:

    【解决方案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'
    

    PS。我对 sqlite 不是很熟悉,但假设它没有直接的分层查询语法,那么这个链接 (http://www.dbforums.com/mysql/1638233-equivalent-start-connect-mysql.html) 指向上述解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2015-01-07
      • 1970-01-01
      • 2021-06-26
      • 2021-07-13
      • 2011-03-13
      相关资源
      最近更新 更多