oracleのUNIONでORA-01790が出まくった話

不慣れにもポチポチoracleのSQLを書いていたとき、ある壁が立ちはだかった。
もし、同じ問題に躓いている人の助けになれば幸いである。

あるテーブルとあるテーブルをUNION ALLし、総件数を求めるというもの
※ここでは最小限のSQLを記載している

SELECT count(*) FROM
(
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER
) UNION ALL (
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER_OLD
)

上記を実行すると下記エラーが発生するのだ。
ORA-01790 式には対応する式と同じData型を持つ必要があります

はて、さてはテーブル定義が違うなと調べてみても全く同じ。
USER_NAMEを別の列名に変更すると出来るものとできないものが・・・うむむ

いろいろいじってみて
SELECT count(*) FROM
(
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER
) UNION ALL (
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER
)
に変更しても同様のエラーが起きことが発覚。そんな馬鹿な。
そこで一つ思い付き試すとしっかりと通った。

結論としては以下のようにすると解決する。

SELECT count(*) FROM
((
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER
) UNION ALL (
SELECT
USER_NAME
FROM
SCHEMA.T_USER_MASTER_OLD
))

UNION ALLの上側のSQLがどこまで対象であるか明示されていなかった。
詳しい優先度はもっと詳しい人にお願いするとして、今回のケースでは
SCHEMA2.T_USER_MASTERのUSER_NAME(char型)とcount(数値型)をUNIONしようとしていたために発生していたようだ。

コメントを残す

メールアドレスが公開されることはありません。