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 を 1 か所で変更するだけで済みます。

于 2012-06-29T21:59:26.133 に答える
0

ここで考慮すべき点がいくつかあります。1 つはデータが変更される場合で、もう 1 つは変更されない場合です。最初のソリューションには 2 つのソリューションが存在し、2 つ目のソリューションには 1 つのみが存在します。

  • 例に示すようにデータが整理されている場合、上位3つを選択できます。

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

  • どの都市がどの親に属するかを指定する別のテーブルを作成し、自分で階層を作成できます。

2番目のものを使用することをお勧めします。

于 2012-06-29T21:59:37.707 に答える