0

注意:不能更改数据架构。我坚持下去。

数据库: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

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

4

3 回答 3

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
于 2012-06-29T21:58:19.427 回答
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。

于 2012-06-29T21:59:26.133 回答
0

这里有几件事情要考虑,一个是你的数据是否会改变,另一个是它是否不会改变,第一个存在两个解决方案,第二个,只有一个。

  • 如果您的数据按示例所示进行组织,则可以选择前 3 个,即

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

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

我推荐使用第二个。

于 2012-06-29T21:59:37.707 回答