2

単純な SQL クエリで奇妙な動作が発生しました。私はOracle 9iで作業しています。クエリにばかげたエラーがないことを確認したいだけです。誰かが私が間違っていることを教えてくれれば。クエリは次のとおりです。

select p.PARTNUM,
        p.N_DATAA, dataa1.ID_DATA as ID_DATAA,
        p.N_DATAF, dataf1.ID_DATA as ID_DATAF,
        p.N_DATAS, datas1.ID_DATA as ID_DATAS
from PIECES p
left join DATA dataa1 on
              dataa1.N_DATA = p.N_DATAA AND
              dataa1.REV_DATA = ( select max(dataa2.REV_DATA) from DATA dataa2 
                                  where dataa2.N_DATA = p.N_DATAA )
left join DATA dataf1 on
              dataf1.N_DATA = p.N_DATAF AND
              dataf1.REV_DATA = ( select max(dataf2.REV_DATA) from DATA dataf2 
                                  where dataf2.N_DATA = p.N_DATAF )
left join DATA datas1 on
              datas1.N_DATA = p.N_DATAS AND
              datas1.REV_DATA = ( select max(datas2.REV_DATA) from DATA datas2 
                                  where datas2.N_DATA = p.N_DATAS )
where p.PARTNUM='MYPARTNUM';

そしてここに結果があります:

"PARTNUM"      "N_DATAA"  "ID_DATAA"  "N_DATAF"   "ID_DATAF"  "N_DATAS"   "ID_DATAS"                     
"MYPARTNUM"    "A23240"   "300"       "F4130"     "398"       "S2330"     ""                

私の問題はフィールドID_DATASに現れます(ID_DATASが返されるはずです、確かに、以下を参照してください)、最後の結合を無視してデータを取得しないかのように動作します。SECOND 結合を削除すると、完全に機能します。Oracleが2つ以上の左結合をサポートしていない場合のようです... (???)

最後の 2 つの左結合を切り替える別の例を次に示します (この場合、問題は ID_DATAF に表示されます)。

select p.PARTNUM,
        p.N_DATAA, dataa1.ID_DATA as ID_DATAA,
        p.N_DATAF, dataf1.ID_DATA as ID_DATAF,
        p.N_DATAS, datas1.ID_DATA as ID_DATAS
from PIECES p
left join DATA dataa1 on
              dataa1.N_DATA = p.N_DATAA AND
              dataa1.REV_DATA = ( select max(dataa2.REV_DATA) from DATA dataa2 
                                  where dataa2.N_DATA = p.N_DATAA )
left join DATA datas1 on
              datas1.N_DATA = p.N_DATAS AND
              datas1.REV_DATA = ( select max(datas2.REV_DATA) from DATA datas2 
                                  where datas2.N_DATA = p.N_DATAS )
left join DATA dataf1 on
              dataf1.N_DATA = p.N_DATAF AND
              dataf1.REV_DATA = ( select max(dataf2.REV_DATA) from DATA dataf2 
                                  where dataf2.N_DATA = p.N_DATAF )
where p.PARTNUM='MYPARTNUM';

そしてここに結果があります:

"PARTNUM"      "N_DATAA"  "ID_DATAA"  "N_DATAF"   "ID_DATAF"  "N_DATAS"   "ID_DATAS"                     
"MYPARTNUM"    "A23240"   "300"       "F4130"     ""          "S2330"     "400"        

ご協力ありがとうございました :)

編集:クエリに完全修飾列名を追加します(私の問題は解決しません)

4

1 に答える 1

2

古いバージョンの Oracle でバグが発生している可能性があります。Oracle 9i は ANSI 結合をサポートする最初のバージョンであり、ANSI 結合構文にいくつかのバグがありました。

クエリは最新 (11.2) の Oracle db ( SQLFiddle ) では実行されず、次のような問題が発生します。

ORA-01799: a column may not be outer-joined to a subquery

したがって、Oracle バージョンのバグは、このクエリが結果を返さないことです。いずれにしても、最新のパッチ セットを実行していることを確認してください。また、アップグレードを計画することをお勧めします。このバージョン非推奨です。延長サポートは3 年前に終了しました。

たとえば、次のようにクエリを書き直す必要があります。

SQL> WITH filtered_data AS (
  2     SELECT n_data, rev_data, id_data
  3       FROM DATA d
  4      WHERE rev_data = (SELECT MAX(rev_data)
  5                          FROM DATA d_in
  6                         WHERE d_in.n_data = d.n_data)
  7  )
  8  SELECT p.partnum,
  9         p.n_dataa,
 10         A.id_data AS id_dataa,
 11         p.n_dataf,
 12         F.id_data AS id_dataf,
 13         p.n_datas,
 14         S.id_data AS id_datas
 15    FROM pieces p
 16    LEFT JOIN filtered_data A ON A.n_data = p.n_dataa
 17    LEFT JOIN filtered_data S ON S.n_data = p.n_datas
 18    LEFT JOIN filtered_data F ON F.n_data = p.n_dataf
 19   WHERE p.PARTNUM = 'MYPARTNUM';

PARTNUM       N_DATAA  ID_DATAA  N_DATAF  ID_DATAF  N_DATAS  ID_DATAS
------------- -------- --------- -------- --------- -------- ---------
MYPARTNUM     A23240   300       F4130    398       S2330    400
于 2013-06-05T08:39:51.703 に答える