2

C# Web アプリケーションで NHibernate を使用して OR マッピングを行いました。すべてのリーフ ノードを取得する場合は、次のようなクエリ ステートメントを使用します。

List<NODE> LeafList =(List<NODE>) Session.CreateQuery("from NODE as node where node.Id not in (select FatherNodeId from NODE)").List<NODE>();

ただし、クエリの後、LeafList のカウントが 0 になります。私のデータベースは次のようなものです:

Id FatherNodeId
1   NULL
3    1
4    3
5    3

したがって、私の予想される結果は、ID が 4 または 5 のノードである必要があります。さらに紛らわしいのは、「not in」を「in」に変更すると、クエリがうまく機能し、ID が 1 または 3 のノードが返されることです。

では、サブクエリにないのは何が問題なのですか?

4

2 に答える 2

0

Not existキーワードを使用

これを試して 。

from NODE as node where node.Id not exists ( select  FatherNodeId from NODE)
于 2013-09-25T05:27:02.087 に答える
0

では、サブクエリにないのは何が問題なのですか?

これは非常に重要な質問です。なぜなら、この問題は一度知れば、NULL 値を扱うときに決して忘れてはならないからです。

問題は NH または .Net にはありません。これは、NULL を含むブール式のセマンティクスにあります。NULL を含むブール式は true になることはなく (常に false になるという意味ではありません)、結果を含む式は true になることはありません。

そのため、 where 句が常に true に見えるこれらのクエリは、 true に解決されないため、結果を返すことはありません。

select 1 where (null=null) or not(null=null)

select 1 where (1=null) or not(1=null)

select 1 where (1<>null) or not(1<>null)

クエリは次のようになります (HQL には詳しくありません)。

from NODE as node 
    where not exists 
        ( from NODE as child where child.FatherNodeId = node.Id )
于 2013-09-25T08:04:42.693 に答える