1

最近、あるマシンから別のマシンに Oracle データベースをコピーしました。

  1. オリジナル: Oracle Database 10g Enterprise Edition リリース 10.2.0.3.0
  2. コピー: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production 何らかの理由で、次のクエリはオリジナルでは機能しますが、コピーでは機能しません。

t.tdt_id がクエリによってグループ内の tdt_id の代わりに置換される場合 ( td_tablespaces t に従って)

誰かがこれがなぜなのか、それがインストールと関係があるのか​​ を説明できますか. データは両方でまったく同じです。

SELECT
    tdt_name as "name", 
    tdt_contents as "Content",         
    tdt_status as "Status",         
    round(( subsize.SubSize_MB ), 2 ) as "size used",         
    round(( sum( MaxMB ) - subsize.SubSize_MB ), 2 ) as "size free" 
FROM    
    td_tablespaces t 
INNER JOIN        
    (
        SELECT 
            tdt_id,
            CASE 
                 WHEN upper( d.df_autoextend ) = 'YES' THEN  round(( sum( df_maxsize ) / 1024 ), 2 )  
                 WHEN upper( d.df_autoextend ) = 'NO' THEN round(( Sum( df_size ) / 1024 ), 2 )                 
            END as MaxMB
        FROM    
            td_datafiles d         
        GROUP BY 
            tdt_id,                 
            d.df_autoextend,                 
            df_maxsize,                 
            df_size         
    ) sub 
ON      
    t.tdt_id = sub.tdt_id 
INNER JOIN        
    (
        SELECT 
            tdt_id,                 
            sum( df_size / 1024 ) -( df_free / 1024 ) SubSize_MB,                 
        df_free      / 1024 SubSize_Free         
        FROM    
            td_datafiles df         
        GROUP BY 
            tdt_id,                 
            df_free         
    ) subsize 
ON 
    t.tdt_id = subsize.tdt_id 
WHERE 
    ins_id   = 2096 
GROUP BY 
    tdt_id,         
    tdt_name,         
    tdt_contents,        
    tdt_status,         
    subsize.SubSize_MB,         
    SubSize_Free 
ORDER BY tdt_contents  
4

2 に答える 2

3

これは「より厳格なルール」ではないと思います。これは、改善されたクエリ最適化の副作用だと思います。Oracle 11 では、オプティマイザは、group by結合される行数を最小限に抑えるために、特定の結合の前にアクションを実行しようとする場合があります。

詳細については、こちらの 19 ~ 20 ページを参照してくださいhttp://www.oracle.com/technetwork/database/bi-datawarehousing/twp-upgrading-10g-to-11g-what-to-ex-133707.pdf

于 2012-10-05T15:33:02.037 に答える
2

Oracle では、クエリで列を参照するときに厳密な規則が適用ORA-00918: column ambiguously definedされ、列が 2 つのテーブルで見つかり、テーブルのプレフィックスまたはエイリアスなしで参照されている場合に発生します。

はとのtdt_id両方で定義されているため、エイリアスまたはテーブル名なしで呼び出すことはできません:tsubsizetdt_id

  • SELECT条項_
  • WHERE条項_
  • ORDER BY条項_

何らかの理由で、10g の一部のバージョンでは、列がGROUP BY節にある場合にエラーが発生しません。これは構文解析の残りの部分と矛盾しています。これはあいまいな結果につながる可能性があり、バグとして分類されたに違いありません。これは 11g で修正されました。

于 2012-10-05T15:49:35.763 に答える