-1

クエリは、case ステートメントがなくても機能します。CASE ステートメントを追加した後、以下のクエリに対して ORA-00979 (GROUP BY 式ではない) を取得します (GROUP BY 句に case ステートメントを追加しなかったため)。それを試した後(Group Byに追加)、ORA-22818(ここではサブクエリ式は許可されていません)になりました。助言がありますか?

注: すべての左外部結合はテーブルを参照するためのものです。 テーブル: d_r_o og はメインの DIM テーブルです。

case ステートメントは、特定のデータ基準のタイムスタンプ条件を返すことです。

select nvl(country_name,'unknown_cntry') CNTRY_NAME, 
       nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
       nvl(REBTN,'u_B_type') B_type_nm,
       decode(to_char(og.TIMESTAMP, 'YYYY'),
                '2015', 'CCCASE',
                        'CURRENT'),
       count(dkey),
       (CASE
          WHEN PG.rite_ts <= (SELECT pssd_dt
                                FROM lpyr
                                WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)
            THEN 'RECTIFIED'
          ELSE 'no'
        END) RCT_STUS,
  FROM d_r_o og
  left outer join LORSR rs
    on og.key = rs.key
  left outer join LRBR br
    on og.key = br.key
  left outer join LUST st
    on og.key = st.key
  group by nvl(country_name,'unknown_cntry') CNTRY_NAME, 
           nvl(rs.reg_tp_nm,'rgs_stus') RG_STUS,
           nvl(REBTN,'u_B_type') B_type_nm,
           decode(to_char(og.TIMESTAMP, 'YYYY'),
                    '2015', 'CCCASE',
                            'CURRENT'),
           count(dkey);
4

2 に答える 2

0

入力してくれてありがとう。皆さんからのフィードバックを少しずつ使って、それを理解することができました。ケースから lpyr をほとんど削除し、from ステートメントの別の左外部結合として配置しました。

次に、CASE ステートメントを : (CASE WHEN PG.rite_ts <= lpyr.pssd_dt
THEN 'RECTIFIED' ELSE 'no' END)に置き換えました。

また、この CASE ステートメントを Group by Clause に追加したところ、機能しました。みんな、ありがとう。うわー!!! 結果は正確です。

于 2016-05-02T03:02:19.173 に答える
0

ORA-22818エラーについては 、これを変更する必要があります

 when PG.rite_ts <= (SELECT pssd_dt FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)

サブクエリ式 SELECT pssd_dtは、比較する 1 つの値ではなく、多くの行を返す可能性があるためPG.rite_ts

これに対する1つの解決策は、min(またはmax?)関数を使用することです

when PG.rite_ts <= (SELECT min(pssd_dt) FROM lpyr WHERE LPYR.PGY_KEY = OG.r_Pgy_KEY)
于 2016-04-30T01:31:13.587 に答える