現象
あるテーブルAに複数のテーブル(B,C,D)をleft joinしてviewを作っているのですが、
view生成用SQLを実行すると結果として4レコード返ってくる(想定通り)のに対して、
同じSQLで作成したviewを参照すると2レコードになってくる現象が起きており困っています。
識者の方、この現象に対して心当たりがありましたら御教授をお願いいたします:bow_tone1:
view生成用SQL概要
select ...(略) from table_a as a left join table_b as b on a.b_id = b.id and b.deleted = false left join table_c as c on a.c_id = c.id and c.deleted = false left join table_d as d on a.d_id = d.id and d.deleted = false ;
- このSQLを直接実行:4件
- このSQLのVIEW参照:2件 ←???
別記事項
left joinで参照する先のテーブルにはon句で一致するデータがない場合があります。
また、on句の中にandでdeletedというフラグがfalseであることを指定しています。
私としては(普通に?)、条件合致しないカラムはnullで結合されてくることを期待しているのですが…。
コンソール(件数確認)
m
test-> ; count ------- 4 (1 行) test=> select count(*) my_view; count ------- 2 (1 行)
version:9.6.x
補足(解決)情報
以下のようにleft join箇所で副問い合わせを行うようにして、
そこにonで結合を行うことで希望のレコードも抽出できました。
直接left join onで記載すると、主レコードの結合キーがnullの場合などに抽出が利かなくなるようです。
訂正依頼&御回答いただいた皆様、ありがとうございました。
select ...(略), b.column1, c.column1, d.column1 from table_a as a left join ( select table_b.id, table_b.column1, ... from table_b where deleted = false ) b on a.b_id = b.id left join ( select table_c.id, table_c.column1, ... from table_c where deleted = false ) c on a.c_id = c.id left join ( select table_d.id, table_d.column1, ... from table_d where deleted = false ) d on a.d_id = d.id ;
回答4件
あなたの回答
tips
プレビュー