SQL:没有父键的树结构

SQL:没有父键的树结构,sql,sqlite,tree,Sql,Sqlite,Tree,注意:无法更改数据架构。我受够了 数据库:SQLite 我有一个简单的树结构,没有父键,只有1层深。为了清晰起见,我简化了数据: ID Content Title 1 Null Canada 2 25 Toronto 3 33 Vancouver 4 Null USA 5 45 New York 6 56 D

注意:无法更改数据架构。我受够了

数据库:SQLite

我有一个简单的树结构,没有父键,只有1层深。为了清晰起见,我简化了数据:

ID    Content       Title
1     Null          Canada
2     25            Toronto
3     33            Vancouver
4     Null          USA
5     45            New York
6     56            Dallas
结构也是有序的,因此所有加拿大城市的ID都大于加拿大的ID 1,小于美国的ID 4


问题:当我不知道一个国家有多少个城市时,如何选择所有城市?

我的查询将每个城市分配给每个国家,这可能不是您想要的,但是:


我的查询将每个城市分配给每个国家,这可能不是您想要的,但是:

编辑

我刚刚意识到,如果没有更大ID的国家,上述方法就行不通。这应该可以解决它

select * from tbl a
 where id > 4
   and id < (select coalesce(b.id,a.id+1) from tbl b where b.content is null and b.id > a.id)
编辑2-还使子查询完全相关,因此只需在一个位置更改国家id

编辑

我刚刚意识到,如果没有更大ID的国家,上述方法就行不通。这应该可以解决它

select * from tbl a
 where id > 4
   and id < (select coalesce(b.id,a.id+1) from tbl b where b.content is null and b.id > a.id)

编辑2 -也使得子查询完全相关,所以只需要在一个地方更改国家ID。

< P>你有几个要考虑的事情,一个是如果你的数据要改变,另一个是如果它不会改变,因为第一个存在2个解决方案,第二个只有一个。 如果您的数据如示例所示进行组织,则可以选择前3项,即

从ID不在的城市中选择*从城市中选择前3个ID

您可以创建另一个表,在其中指定哪个城市属于哪个父级,并自行创建层次结构


<>我重述要使用的第二个词。

你有几个要考虑的事情,一个是如果你的数据要改变,另一个是如果它不改变,因为第一个存在2个解决方案,第二个只有一个。 如果您的数据如示例所示进行组织,则可以选择前3项,即

从ID不在的城市中选择*从城市中选择前3个ID

您可以创建另一个表,在其中指定哪个城市属于哪个父级,并自行创建层次结构

我建议使用第二个

select * from tbl a
 where id > 4
   and id < (select coalesce(b.id,a.id+1) from tbl b where b.content is null and b.id > a.id)