【问题标题】:SQL: Tree structure without parent keySQL:没有父键的树结构
【发布时间】:2012-06-29 21:38:56
【问题描述】:

注意:数据架构无法更改。我被它困住了。

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

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

【问题讨论】:

    标签: sql sqlite tree


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:
      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。

      【讨论】:

        【解决方案3】:

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

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

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

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

        我推荐使用第二个。

        【讨论】:

          猜你喜欢
          • 2015-04-26
          • 2014-07-04
          • 1970-01-01
          • 2021-07-29
          • 1970-01-01
          • 2017-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多