Asakusa Framework Advent Calendar 2019の15日目、SQLをAsakusaFWに変換するポイントについてです。
SELECT文のFROM句におけるテーブル結合を実現する方法としてCoGroup・MasterJoinUpdate・Extract(+GroupView)演算子を使う方法を紹介してきました。
これらの方法に共通するSQLの問題点として、(WHERE条件の話でも出した)NULL同士の結合があります。
SQLではNULL同士の結合(「=」による演算)はUNKNOWNなのでFALSE扱い、すなわち結合しないのですが、AsakusaFWではnull==nullはtrueなので結合することになります。
大抵の結合ではマスターテーブルのプライマリキーに対して結合することになる(と思いたい)ので、プライマリキーならNOT NULLなのでこの問題を考える必要は無いのですが。
これを厳密に対処するなら、
CoGroup演算子の場合:渡ってきたデータの結合キー項目がnullかどうかチェックする
MasterJoinUpdate演算子の場合:MasterSelectionで結合キー項目がnullかどうかチェックする
GroupViewの場合:結合キー項目がnullだったらGroupViewから取得しない
のような処理を入れる必要があるでしょう。
個人的には、AsakusaFWの結合方法のオプションとして「null同士だったら一致しないものとして扱うモード」があると上記の問題の対処が楽になるなーと思うのですが、
しかしSQLに似せる為だけにそういうオプションを入れるのは微妙だとも思います^^;
※コメント投稿者のブログIDはブログ作成者のみに通知されます