1

最近,我将 Oracle 数据库从一台机器复制到另一台机器。

  1. 原文:Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
  2. 副本:Oracle 数据库 11g 快捷版 11.2.0.2.0 版 - 生产 由于某种原因,以下查询适用于原始版本,但不适用于副本。

如果 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如果在两个表中找到列并且在没有表前缀或别名的情况下引用列,则会引发。

由于在和tdt_id中都定义了,因此您无法在没有别名或表名的情况下调用:tsubsizetdt_id

  • SELECT条款_
  • WHERE条款_
  • ORDER BY条款_

由于某些原因,在 10g 的某些版本中,当列位于GROUP BY子句中时不会引发错误。这与语法解析的其余部分不一致,这可能导致结果不明确,并且必须被归类为错误。这已在 11g 中得到纠正。

于 2012-10-05T15:49:35.763 回答