fc2ブログ

(元)社内SEの徒然なる日記

SQLで特定の条件で結合する条件を変えるテーブル結合

■ SQL結合

一つのテーブルに親子関係を表す区分を持たせて、その中で得意先と仕入先の情報を管理しています。
特定の条件で結合するSQL1

この時に、ある得意先の親に設定されている得意先枝と仕入先枝が、子に設定されている値と一致しているかを調べたかったのです。

ただし、得意先枝は親の得意先区分が"1"(対象)の時だけで良く、仕入先枝は親の仕入先区分が"1"(対象)の時だけ調べればよいって条件が付きます。

こんな感じでいけるかな?
特定の条件で結合するSQL2

親子区分が"1"(親)のデータを引っこ抜いて、得意先区分が"1"(可)の時は得意先枝が異なる、仕入先区分が"1"(可)の時は仕入先枝が異なるデータを抽出します。これで、親と子で一致しないデータが抽出される筈です。

このSQL、条件によってテーブル結合の条件を動的に変えているのですが、こういう書き方って使えるんでしたっけ?

■ SQL

実験してみることにしました。

Oracleの場合、SQLはこんな感じでしょうか。


SELECT
A.取引先, A.親子区分, A.得意先枝, B.得意先枝, A.仕入先枝, B.仕入先枝
FROM
マスタ A, マスタ B
WHERE
A.親子区分 = '1'
AND A.取引先 = B.取引先
AND (
A.得意先区分 = '1'
AND A.得意先枝 <> B.得意先枝
)
OR
(
A.仕入先区分 = '1'
AND A.仕入先枝 <> B.仕入先枝
)



Accessの場合はこうですかね。


SELECT
A.取引先, A.親子区分, A.得意先枝, B.得意先枝, A.仕入先枝, B.仕入先枝
FROM
マスタ AS A INNER JOIN マスタ AS B ON
(
A.得意先区分 = "1"
AND A.取引先 = B.取引先
AND A.得意先枝 <> B.得意先枝
)
OR
(
A.仕入先区分 = "1"
AND A.取引先 = B.取引先
AND A.仕入先枝 <> B.仕入先枝
)
WHERE
A.親子区分="1"



■ 実験

テストデータを用意します。
特定の条件で結合するSQL5

得意先と仕入先でそれぞれ、親子で枝が違うデータを用意します。

んで、SQLを実行した結果はこちら。
特定の条件で結合するSQL6


うんうん、エラーにもならないし、抽出結果も想定通りです。どうやら問題ないようですね。

■ 後書き

Oracleに慣れている身としては、AccessでのSQLの書き方に違和感を覚えます。なんか、SQLを見ても上手くイメージ出来ないというか・・・

今回も、AccessでSQLを書くのにかなり苦戦しました。単にこっちの書き方に不慣れなだけって話ではあるんですがね。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---


スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する