【问题标题】:SQL Ordering in a 1 - N - 1 relationship1 - N - 1 关系中的 SQL 排序
【发布时间】:2015-12-02 13:58:35
【问题描述】:

我有一个带有两个表的 SQLite 数据库:

A
PK |名称

B
PK | FK1 | FK2

在表 B 中,FK1 和 FK2 都引用了表 A 上的 PK(实际上只有一个被设置为 DB 上的外键,但 FK2 中的值仍然取自表 A 的所有 PK 的集合) .

表 B 的目的是允许非线性排序。这拥有“下一个”关系。例如:

A
PK |姓名

1 |第一
2 |第二
3 |第三个

B
PK | FK1 | FK2

1 | 1 | 2
2 | 2 | 3

这表示从 First -> Second -> Third 的线性流。

我正在寻找从 A 中对结果排序的最佳方法。最佳情况下,线性流将按照表 B 指定的顺序生成。非线性流会略有不同,但大多数情况下应按同样的方式(除了平行路径彼此相邻放置)。

我能想到的每一个连接都被我愚弄了,而 SQLite 不支持 PL/SQL,这使得这个问题变得更加困难。目前,我只是在跑步:

A left join B on A.PK = B.FK1 order by B.FK2.  

连接这些表并对结果排序的最佳方式是什么?

【问题讨论】:

  • 您希望它们按什么顺序排列?
  • 我希望它们尽可能接近表 B 中 FK1 和 FK2 列所描述的顺序(显然在某些情况下这是不可能的)
  • 我认为你需要的语法是with recursive。这应该允许您选择任何起点并在树上行走。

标签: sql sqlite join


【解决方案1】:
WITH RECURSIVE list AS (
  SELECT PK, Name
  FROM A
  WHERE PK = 1
  UNION ALL
  SELECT A.PK, A.Name
  FROM list
  JOIN B ON list.PK = B.FK1
  JOIN A ON B.FK2 = A.PK
)
SELECT * FROM list;

【讨论】:

  • 这非常有帮助,谢谢!第一个 select 语句(其中 pk = 1)中的 where 子句只允许它返回一条记录(id = 1 的记录),但是
  • 您说得对,先生,我需要弄清楚为什么它不能处理完整的数据。将您的答案标记为正确。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多