Oracle数据库安装版本对分组函数实施更严格的SQL规则
最近,我将一个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工作 有人能解释一下为什么会这样,以及这是否与安装有关。两者的数据完全相同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
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是出现在多个表中的唯一列名