いつもお世話になっております。
Oracleを使用しているのですが、Webアプリで仕訳元帳の照会を行うことになりました。
仕訳データの中に入っている勘定科目と補助科目の科目名を表示したいのですが、
SQL文で、
sql
1SELECT a.勘定科目CD, a.補助科目CD, b.勘定科目名, c.補助科目名 2FROM 仕訳 a 3LEFT JOIN 勘定科目 b ON a.勘定科目CD = b.勘定科目CD 4LEFT JOIN 補助科目 c ON a.勘定科目CD = c.勘定科目CD AND a.補助科目CD = c.補助科目CD 5WHERE a.計上日 >= b.有効開始日 AND a.計上日 < b.有効終了日 6AND a.計上日 >= c.有効開始日 AND a.計上日 < c.有効終了日;
とした時、全ての勘定科目に補助科目があるとすれば問題ないと思うのですが、当然ながら、勘定科目の中には補助科目を持たないものも存在します。
このため、WHERE文で、補助科目の無い場合を想定して、下記のように書いていますが、WHERE文が複雑だと処理効率が悪すぎることになります。
sql
1SELECT a.勘定科目CD, a.補助科目CD, b.勘定科目名, c.補助科目名 2FROM 仕訳 a 3LEFT JOIN 勘定科目 b ON a.勘定科目CD = b.勘定科目CD 4LEFT JOIN 補助科目 c ON a.勘定科目CD = c.勘定科目CD AND a.補助科目CD = c.補助科目CD 5WHERE (a.補助科目 is not NULL AND a.計上日 >= b.有効開始日 AND a.計上日 < b.有効終了日 6AND a.計上日 >= c.有効開始日 AND a.計上日 < c.有効終了日) OR 7(a.補助科目 is NULL AND a.計上日 >= b.有効開始日 AND a.計上日 < b.有効終了日)
基本的なことで大変申し訳ないのですが、
こうした場合、LEFT JOIN の中に日付の結合条件を書けば同じことになるのでしょうか?
sql
1LEFT JOIN 勘定科目 b ON a.勘定科目CD = b.勘定科目CD 2AND a.計上日 >= b.有効開始日 AND a.計上日 < b.有効終了日 3LEFT JOIN 補助科目 c ON a.勘定科目CD = c.勘定科目CD AND a.補助科目CD = c.補助科目CD 4AND a.計上日 >= b.有効開始日 AND a.計上日 < b.有効終了日 5AND a.計上日 >= c.有効開始日 AND a.計上日 < c.有効終了日
回答2件
あなたの回答
tips
プレビュー