1

私はこのテーブルを持っています

CREATE TABLE IF NOT EXISTS `branch` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `studcount` int(11) DEFAULT NULL,
  `username` varchar(64) NOT NULL,
  `branch_fk` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKADAF25A2A445F1AF` (`branch_fk`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
ALTER TABLE `branch`
  ADD CONSTRAINT `FKADAF25A24CEE7BFF` FOREIGN KEY (`login_fk`) REFERENCES `login` (`id`);

ご覧のとおり、各テーブルには他のブランチ行(自己関係)を指す外部キーがあります。HQL(HQLを優先)を使用したクエリでユーザー名(またはID)を取得し、List<String>(ユーザー名の場合)またはList<Integer>( id)それは私のすべてのサブブランチのリストでした。

例で示しましょう

id         studentcount            username            branch_fk
1          312                     user01                NULL
2          111                     user02                1
3          432                     user03                1
4          543                     user04                2
5          433                     user05                3
6          312                     user06                5
7          312                     user06                2
8          312                     user06                7

GetSubBranch(3)を呼び出すと、次のようになります。

5, 6

GetSubBranch(2)を呼び出すと、次のようになります。

4, 7, 8
4

2 に答える 2

1

これを行うための移植可能な SQL はないと思います。さらに、いくつかの主要なデータベースの SQL はこれを表現できないと思います。

したがって、この機能は HQL でできることの一部ではありません。ごめん :-(

いくつかの方法を読みました。それらのほとんどは、レベルの数(事前に固定?いくつ?)、レコードの数(数百?数百万?)などに応じたトレードオフを伴います。

  1. in(ids)あるレベルが空になるまで、( を使用して) 毎回レベルを下げながら、自分で再帰クエリを実行します。
  2. 固定数の左結合でクエリを実行します (深さを事前に知る必要があります。または、必要に応じて残りのレコードを見つけるためにクエリを繰り返す必要がある場合があります。ポイント 1 を参照してください)。
  3. 非正規化された情報をどこかで利用できるようにします。それは、インデックスの非正規化されたテーブルのコピーである可能性があります。しかし、キャッシュされたメモリ内コピーを好むでしょう。これは、1 つの要求だけで完全に満たされ、更新または無効化されます...テーブル サイズ、最大深度、書き込み頻度などの他の要件に応じて)。
于 2009-08-02T14:42:55.723 に答える
1

「ネストされたセット」を見ることができます。クエリは「:L と :R の間」の問題になります。ただし、トポロジカル/階層的な並べ替えは失われます (再帰的/階層的なクエリと比較して)。新しいアイテムを挿入すると、すべてではないにしてもいくつかの行を更新する必要があるため、非常にコストがかかります...

于 2011-10-26T17:28:27.223 に答える