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
)
この方法が最適かと言われれば自信はありませんが、ひとまず解決したのでよしとします。
執筆者:Auderit
関連記事
-
[jQuery]エラー「Target dimension not set」
jQueryを使用した画面の作成時に上手くいかなかったところ 「Target dimension not set」 の原因と対策 スポンサーリンク ターゲットの指定がない こんな感じの構造で画面に図を …
-
[Visualforce][jQuery]ID指定で要素を選択する
Visualforceでの開発にて、jQueryで要素を IDで指定したいのになかなかうまく取得できなくて苦しみました。 いやだいぶハマりましたが以下にて解決 フルパスの指定は出来なかった 状況を簡単 …
-
[ORACLE]ORACLEのTO_DATEを使用した年の変換について!
先日、作業中に発生した問題を共有することで少しでも皆さんが安定したリリースを迎えられますよう。。 TO_DATEによるYYYY変換の落とし穴 発生した内容でお話しするので、ピンポイントなケースになりま …
-
[jQuery]エラー「No plot target specified」
jQueryを使用した画面の作成時に上手くいかなかったところ 「No plot target specified」 の原因と対策 スポンサーリンク ターゲットの指定がない こんな感じの構造で画面に図を …
-
[eclipse]エラー「インスタンスが割り当て解除されるのを待っています」
eclipseでの開発中に発生したエラーです。 「インスタンスが割り当て解除されるのを待っています」 原因はとても簡単でした。備忘録に。 スポンサーリンク メモリの解放忘れ eclipseでの開発中の …