• ベストアンサー

ユニオンクエリーで連結されたテーブルを取得したい

ユニオンクエリーでいくつかのテーブルを連結しておりますが、このデータを選択した時に どのテーブルのデータを選択しているか、テーブル名を取得したいのですが、何か方法はありますでしょうか? 端的に言いますと、ユニオンクエリーで選択したデータの更新をしたいのです。 お分かりになる方がいらっしゃいましたら、どうぞご教授下さい。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ユニオン内の各クエリのフィールドはどのテーブルから抽出されたものかは、クエリの構造でわかりますよね。 で、それぞれのクエリのうち、どれにヒットしたのかが判明すれば、どのテーブルから抽出されたものかが判るかと思います。 なので、私ならば、ユニオン内の各クエリの末尾にフィールドを追加し、これに、例えば、1番目のクエリなら1、2番目のクエリなら 2 を固定でいれてしまいます。 すると、このフィールドを判定することで、間接的にそれぞれのフィールドがどのテーブルから来たものかがわかります。 Union A のクエリ ( select T1.f1 as FF1, T2.f2 as FF2, 1 as FF3 from T1,T2 where T1.f3=T2.f3 ) union all ( select T2.f1 as FF1, T3.f2 as FF2, 2 as FF3 from T2, T3 where T2.f3=T3.f3 ) union all ( select T3.f1 as FF1, T1.f2 as FF2, 3 as FF3 from T1,T3 where T1.f3=T3.f3 ) 実作業のクエリ Selct FF1,FF2,FF3 from A 結果 1,2,1 <- 一番目のクエリ、つまりFF1はT1、FF2はT2から取得 2,4,2 <- 二番目のクエリ、つまりFF1はT2、FF2はT3から取得 1,2,3 <- 三番目のクエリ、つまりFF1はT3、FF2はT1から取得 もっと楽な方法があるかもしれませんが・・・

xmoto
質問者

お礼

ありがとうございます。 参考にさせて頂きます。

その他の回答 (1)

回答No.2

unionした結果の元となるテーブルは、基本的に取得できないと思います。 なので、#1で書かれたような方法が、最も考えやすい方法なのではないでしょうか。 >端的に言いますと、ユニオンクエリーで選択したデータの更新をしたいのです。 >お分かりになる方がいらっしゃいましたら、どうぞご教授下さい。お願いします。 仮に、#1の方法で、元のテーブルを判断したとして・・ どうやって更新するんですか? 更新すべき情報を特定した後に、改めて更新命令を発効するのでしょうか?? どうせなら、”更新可能なクエリ”を模索した方が、更新すべきデータを特定した状態で、 カレントレコードを更新できるので、合理的な気がします。 ※RDBMSによって、更新可能なクエリの制限が違うので、必ず使えるとは限りませんが、 更新可能なクエリを使う方が合理的&効率的だと思います。

xmoto
質問者

お礼

色々と考えてみましたが、実現できそうに無いと判断しました。 個々のテーブルをユニオンで結合しないと全体的な検索が出来ないのと 各テーブルに散らばっているデータをそれぞれに一括して更新をしたいと 考えていたのですが、どうにも無理ですね。 伝票単位で処理するように考え方を切り替えます。 ありがとうございました。

関連するQ&A