サブクエリを実行し、その結果を内部結合してクエリを生成したいと思います。内部結合クエリをテストしたので、これを実行したいと思います。MySql では、ストレート IN サブクエリと比較してはるかにパフォーマンスが高いようです。
以下は、私が再現しようとしているタイプの sql の非常に基本的な例です。
テーブル
アイテム
- アイテム ID
- 名前
項目関係
- アイテム ID
- 関係 ID
作成したいSqlの例
名前が「bob」の ITEM の RELATION の数を教えてください:
select ir.itemId, count(ir.relationId)
from ItemRelations ir
inner join (select itemId from Items where name = 'bob') sq
on ir.itemId = sq.itemId
group by ir.itemId
ベース Nhibernate QueryOver
var bobItems = QueryOver.Of<Item>(() => itemAlias)
.Where(() => itemAlias.Name == "bob")
.Select(Projections.Id());
var bobRelationCount = session.QueryOver<ItemRelation>(() => itemRelationAlias)
.Inner.Join(/* Somehow join the detached criteria here on the itemId */)
.SelectList(
list =>
list.SelectGroup(() => itemRelationAlias.ItemId)
.WithAlias(() => itemRelationCountAlias.ItemId)
.SelectCount(() => itemRelationAlias.ItemRelationId)
.WithAlias(() => itemRelationCountAlias.Count))
.TransformUsing(Transformers.AliasToBean<ItemRelationCount>())
.List<ItemRelationCount>();
これを単一のクエリにリファクタリングできる可能性があることはわかっていますが、上記は単純な例にすぎません。分離された QueryOver を変更することはできません。これは、私のコードに渡され、システムの他の部分で使用されているためです。
切り離された基準で内部結合を実行できるかどうかは誰にもわかりませんか?