AUDERIT.COM

フリーランスエンジニアの知識のアルバム

ORACLE スキル

[Oracle]テーブルの最新の値を外部結合で取得したいなら。ORA-01799:列は副問い合わせに対して外部結合されません。

投稿日:2019年3月3日 更新日:

Oracleで発生したエラー

ORA-01799:列は副問い合わせに対して外部結合されません。

他にも解決策はあるのでしょうが、今回はこれで解決

スポンサーリンク

Oracleでは外部結合で最大値を取得できなかった

状況
簡単に例にして見ましたが事象はこちら。

・商品マスタの中でその商品の予約者も管理している。
・予約者がいた時だけ予約者の名前を取得したい。
・顧客情報マスタは登録情報が更新されるたびに、レコードを新規に作成し、暦管理している。
・予約者の名前は最新の登録名で取得したい。
・退会していると現在歴はなくなるので、sysdateでは取得できない。

テーブル構成はこんな感じに。

商品マスタ:product

論理名 物理名
商品コード product_code
商品名 product_name
発売日 release_date
予約者コード client_code

顧客情報マスタ:client

論理名 物理名
顧客コード client_code
顧客名 client_name
有効開始日 start_date
有効終了日 end_date
スポンサーリンク

商品の過去の予約内容を確認する際に、退会してしまった顧客でも最後に登録されていた氏名を取得します。
最後の氏名としているのは名前の登録が変更された場合のことを考慮してのこと。

予約者がいないことも考えられるので、顧客マスタは外部結合にしたい。
顧客マスタからはMAX関数を使って予約者の最新のレコードを取得したいのですが、
外部結合を使用するとダメなようでした。

ORA-01799:列は副問い合わせに対して外部結合されません。

このエラーが出るので対策としては
下記のように外部結合部分を変更したこと。

—–ダメな例—–
SELECT
pro.release_date 発売日
pro.product_name 商品名,
cli1.client_name 予約者名
FROM
product pro,
client cli1
WHERE
pro.release_date = to_date(‘20190401′,’YYYYMMDD’)
AND cli1.start_date(+) = (
SELECT
MAX(cli2.START_DATE)
FROM
client cli2
WHERE
pro.client_code = cli2.client_code(+)
)

—————
—–良い例—–
SELECT
pro.release_date 発売日
pro.product_name 商品名,
cli1.client_name 予約者名
FROM
product pro,
client cli1
WHERE
pro.release_date = to_date(‘20190401′,’YYYYMMDD’)
AND pro.client_code is null
OR (pro.client_code is not null
cli1.start_date = (
SELECT
MAX(cli2.START_DATE)
FROM
client cli2
WHERE
pro.client_code = cli2.client_code
)

この方法が最適かと言われれば自信はありませんが、ひとまず解決したのでよしとします。

スポンサーリンク

-ORACLE, スキル

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

[eclipse]エラー「インスタンスが割り当て解除されるのを待っています」

eclipseでの開発中に発生したエラーです。 「インスタンスが割り当て解除されるのを待っています」 原因はとても簡単でした。備忘録に。 スポンサーリンク メモリの解放忘れ eclipseでの開発中の …

[jQuery]エラー「No plot target specified」

jQueryを使用した画面の作成時に上手くいかなかったところ 「No plot target specified」 の原因と対策 スポンサーリンク ターゲットの指定がない こんな感じの構造で画面に図を …

[Visualforce][jQuery]ID指定で要素を選択する

Visualforceでの開発にて、jQueryで要素を IDで指定したいのになかなかうまく取得できなくて苦しみました。 いやだいぶハマりましたが以下にて解決 フルパスの指定は出来なかった 状況を簡単 …

[jQuery]エラー「Target dimension not set」

jQueryを使用した画面の作成時に上手くいかなかったところ 「Target dimension not set」 の原因と対策 スポンサーリンク ターゲットの指定がない こんな感じの構造で画面に図を …

[MySQL]リストアの際に、読み込みファイルが大きすぎるとエラーになるので設定を変更する。

今回は既存のシステムの運用のため、新しいPCへのセットアップを行っている時に発生したMySQLのエラーの解消方法です。 スポンサーリンク 発生したエラーはこちら MySQL server has go …