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
                    )
この方法が最適かと言われれば自信はありませんが、ひとまず解決したのでよしとします。
 
											