SQL:没有父键的树结构

时间:2012-06-29 21:38:56

标签: sql sqlite tree

注意:无法更改数据架构。我坚持了下来。

数据库:SQLite

我有一个简单的树结构without parent keys,只有1级深度。为清楚起见,我简化了数据:

ID    Content       Title
1     Null          Canada
2     25            Toronto
3     33            Vancouver
4     Null          USA
5     45            New York
6     56            Dallas

结构也是顺序的,因此所有加拿大城市都是>加拿大的ID为1且低于美国的ID为4

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

3 个答案:

答案 0 :(得分:2)

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

http://sqlfiddle.com/#!5/94d63/3

SELECT *

FROM (
      SELECT
        place.Title AS country_name,
        place.ID AS id,

        (SELECT MIN(ID)
         FROM place AS next_place
         WHERE next_place.ID > place.ID
           AND next_place.Content IS NULL
        ) AS next_id

      FROM place
      WHERE place.Content IS NULL
     ) AS country

INNER JOIN place
 ON place.ID > country.id
AND CASE WHEN country.next_id IS NOT NULL
         THEN place.ID < country.next_id
         ELSE 1 END

答案 1 :(得分:1)

select * from tbl
 where id > 1
   and id < (select min(id) from tbl where content is null and id > 1)

修改

我刚刚意识到,如果没有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。

答案 2 :(得分:0)

你有几个要考虑的事情,一个是你的数据会改变而另一个是否会改变,因为第一个存在2个解决方案,而第二个只存在一个。

  • 如果您的数据按照示例中的说明进行整理,则可以选择前3位,即

    SELECT * FROM CITIES WHERE ID NOT IN (SELECT TOP 3 ID FROM CITIES)

  • 您可以创建另一个表,指定城市属于哪个城市,并自行制作层次结构。

我建议使用第二个。