注意:无法更改数据架构。我坚持了下来。
数据库: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
问题:当我不知道有多少个城市时,如何选择所有国家?
答案 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)
您可以创建另一个表,指定城市属于哪个城市,并自行制作层次结构。
我建议使用第二个。