Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle数据库安装版本对分组函数实施更严格的SQL规则_Sql_Oracle_Oracle10g_Oracle11g - Fatal编程技术网

Oracle数据库安装版本对分组函数实施更严格的SQL规则

Oracle数据库安装版本对分组函数实施更严格的SQL规则,sql,oracle,oracle10g,oracle11g,Sql,Oracle,Oracle10g,Oracle11g,最近,我将一个Oracle数据库从一台机器复制到另一台机器 原件:Oracle Database 10g Enterprise Edition 10.2.0.3.0版 副本:Oracle Database 11g Express Edition 11.2.0.2.0版-生产 出于某种原因,以下查询适用于原件,但不适用于副本。 如果用一个t.tdt_id替换组中的tdt_id,则查询将按照td_表空间t工作 有人能解释一下为什么会这样,以及这是否与安装有关。两者的数据完全相同 SELECT

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

原件:Oracle Database 10g Enterprise Edition 10.2.0.3.0版 副本:Oracle Database 11g Express Edition 11.2.0.2.0版-生产 出于某种原因,以下查询适用于原件,但不适用于副本。 如果用一个t.tdt_id替换组中的tdt_id,则查询将按照td_表空间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  

我不认为这是“更严格的规则”,我认为这是改进查询优化的副作用。在oracle 11中,优化器可能会在某些联接之前尝试执行group by操作,以最小化联接的行数


详细信息请参见第19-20页

我不认为这是“更严格的规则”,我认为这是改进查询优化的副作用。在oracle 11中,优化器可能会在某些联接之前尝试执行group by操作,以最小化联接的行数


有关详细信息,请参见第19-20页

Oracle在查询中引用列时强制执行严格的规则,如果在两个表中找到一个列,并且引用时没有表前缀或别名,则将引发ORA-00918:定义不明确的列

由于tdt_id是在t和subsize中定义的,因此在以下情况下,如果没有别名或表名,则无法调用tdt_id:

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

Oracle在查询中引用列时强制执行严格的规则,如果在两个表中找到一个列,并且引用时没有表前缀或别名,则将引发ORA-00918:定义不明确的列

由于tdt_id是在t和subsize中定义的,因此在以下情况下,如果没有别名或表名,则无法调用tdt_id:

SELECT子句 WHERE子句 订单条款
由于某些原因,在某些版本的10g中,当列位于GROUP BY子句中时,不会引发错误。这与语法解析的其余部分不一致,这可能会导致不明确的结果,并且必须被归类为bug。这已经在11G中被修正了。< /P>查询是如何失败的?哦,对不起,一个不明确定义的错误发生的列显示查询失败了吗?哦,对不起,一个列不明定义的错误发生了。你会认为10G中的一个错误是11G修复吗?我可以想象世界各地的DB管理员在他们的查询中写入了这一点,他们在升级时必须修复它。他们编写了不明确的查询=这应该在升级之前的测试中捕获,我希望您测试这类事情!在没有事先对新测试版本运行所有查询的情况下,不要进行重大版本更改。编辑:顺便说一句,我被这个意外的错误抓住了,在迁移过程中我不得不更改一些查询。不,我没有编写查询,它被嵌入了一些.net代码中。另一个令人头痛的问题。上面保罗的回答似乎可以解释为什么它会这样。我可以发现它并证明这一点,但恐怕我没有时间这么做。谢谢你的意见,谢谢。我认为@Paul是对的:作为CBO升级的一部分,Oracle纠正了10g错误,没有提升ORA-918。MOS参考:通过阅读该错误,它似乎是oracle 10g中已知和公认的错误,但在11g中得到了纠正,并解释了我的问题。我不认为Paul的回答提供了我遇到的这个bug的答案,它只是描述了改进查询优化的方法。你怎么认为。谢谢你对这一切的投入。你认为10G的错误是11G修复吗?我可以想象世界各地的DB管理员在他们的查询中写入了这一点,他们在升级时必须修复它。他们编写了不明确的查询=这应该在升级之前的测试中捕获,我希望您测试这类事情!在没有事先对新测试版本运行所有查询的情况下,不要进行重大版本更改。编辑:顺便说一句,我被这个意外的错误抓住了,在迁移过程中我不得不更改一些查询。不,我没有编写查询,它被嵌入了一些.net代码中。另一个令人头痛的问题。上面保罗的回答似乎可以解释为什么它会这样。我可以发现它并证明这一点,但恐怕我没有时间这么做。谢谢你的意见,谢谢。我认为@Paul是对的:作为CBO升级的一部分,Oracle纠正了10g错误,没有提升ORA-918。MOS参考:通过阅读该错误,它似乎是oracle 10g中已知和公认的错误,但在11g中得到了纠正,并解释了我的问题。我不知道
nk Paul的回答为我遇到的这个bug提供了答案,它只是描述了改进查询优化的方法。你怎么认为。另外,谢谢你在这方面的所有意见。@@paul谢谢你的链接,我阅读了相关章节。为什么查询在没有t的情况下对组中的其他成员有效。引用?因为tdt_id是出现在多个表中的唯一列名@@paul谢谢您的链接,我阅读了相关部分。为什么查询在没有t的情况下对组中的其他成员有效。引用?因为tdt_id是出现在多个表中的唯一列名