查看: 1459|回复: 9

同样的语句10g能执行11g报错。

[复制链接]
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:11
跳转到指定楼层
1#
发表于 2018-9-28 08:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 高手不哭 于 2018-9-28 10:43 编辑

create table test(t_id int,t_name varchar2(50));
create table test2(t_id int,t_name varchar2(50));

insert into test values(1,'a');
insert into test values(2,'b');
insert into test values(3,'c');

insert into test2 values(1,'a');
insert into test2 values(2,'b');
insert into test2 values(3,'c');

select a.t_id,a.t_name from test a LEFT JOIN
(select t_id,t_name from test2 group by t_name) b
on a.t_id=b.t_id and a.t_name=b.t_name where a.t_id=1
group by a.t_id,a.t_name;

同样的sql ,在10g下就能执行,在11g下就会报错 ora-00979 不是group by 表达式。红色部分看起来确实是错的,可是10g下整句执行就有结果。
如何能做到这个语句再11g下也能执行呢。

我之后做了个测试 10.2.0.3之前的版本就能执行  到10.2.0.4就会报错了。
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26现代
日期:2013-09-13 12:03:19优秀写手
日期:2014-03-25 05:59:50秀才
日期:2017-09-18 17:04:46蒙奇·D·路飞
日期:2018-09-10 10:43:30妮可·罗宾
日期:2018-12-20 17:00:02弗兰奇
日期:2020-03-28 20:32:37
2#
发表于 2018-9-28 10:55 | 只看该作者
这个明显是BUG,为什么还要用这种?

使用道具 举报

回复
论坛徽章:
1
ITPUB18周年纪念章
日期:2018-11-13 15:40:45
3#
发表于 2018-9-28 11:48 | 只看该作者

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:11
4#
 楼主| 发表于 2018-9-28 13:19 | 只看该作者
小学徙 发表于 2018-9-28 10:55
这个明显是BUG,为什么还要用这种?

你的意思是10.2.0.3这个版本之前的bug是么,有具体点的信息么。

使用道具 举报

回复
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26现代
日期:2013-09-13 12:03:19优秀写手
日期:2014-03-25 05:59:50秀才
日期:2017-09-18 17:04:46蒙奇·D·路飞
日期:2018-09-10 10:43:30妮可·罗宾
日期:2018-12-20 17:00:02弗兰奇
日期:2020-03-28 20:32:37
5#
发表于 2018-9-28 15:55 | 只看该作者
这还需要具体吗?  select t_id,t_name from test2 group by t_name 这句你觉得应该返回什么结果?

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:11
6#
 楼主| 发表于 2018-9-28 16:41 | 只看该作者
小学徙 发表于 2018-9-28 15:55
这还需要具体吗?  select t_id,t_name from test2 group by t_name 这句你觉得应该返回什么结果?

我知道这句错了,但是10。2.0.3下是可以执行的。 你说是bug所以我想咨询一下有相关的信息么。

使用道具 举报

回复
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26现代
日期:2013-09-13 12:03:19优秀写手
日期:2014-03-25 05:59:50秀才
日期:2017-09-18 17:04:46蒙奇·D·路飞
日期:2018-09-10 10:43:30妮可·罗宾
日期:2018-12-20 17:00:02弗兰奇
日期:2020-03-28 20:32:37
7#
发表于 2018-9-28 18:09 | 只看该作者
高手不哭 发表于 2018-9-28 16:41
我知道这句错了,但是10。2.0.3下是可以执行的。 你说是bug所以我想咨询一下有相关的信息么。

10g的执行计划是错误的认为先全表再group.
----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name  | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY        |       |      1 |      1 |    40 |     6  (34)| 00:00:01 |      1 |00:00:00.01 |       6 |       |       |          |
|   2 |   VIEW                |       |      1 |      1 |    40 |     6  (34)| 00:00:01 |      1 |00:00:00.01 |       6 |       |       |          |
|   3 |    HASH GROUP BY      |       |      1 |      1 |   105 |     6  (34)| 00:00:01 |      1 |00:00:00.01 |       6 |       |       |          |
|*  4 |     HASH JOIN OUTER   |       |      1 |      1 |   105 |     5  (20)| 00:00:01 |      1 |00:00:00.01 |       6 |  1123K|  1123K|  178K (0)|
|*  5 |      TABLE ACCESS FULL| TEST  |      1 |      1 |    65 |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       3 |       |       |          |
|*  6 |      TABLE ACCESS FULL| TEST2 |      1 |      1 |    40 |     2   (0)| 00:00:01 |      1 |00:00:00.01 |       3 |       |       |          |
----------------------------------------------------------------------------------------------------------------------------------------------------

12c的执行度计划:
-------------------------------------------------------------------------------
| Id  | Operation             | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |    70 |     6  (34)| 00:00:01 |
|   1 |  HASH GROUP BY        |       |     1 |    70 |     6  (34)| 00:00:01 |
|*  2 |   HASH JOIN OUTER     |       |     1 |    70 |     5  (20)| 00:00:01 |
|*  3 |    TABLE ACCESS FULL  | TEST  |     1 |    40 |     2   (0)| 00:00:01 |
|   4 |    VIEW               |       |     1 |    30 |     3  (34)| 00:00:01 |
|   5 |     HASH GROUP BY     |       |     1 |    40 |     3  (34)| 00:00:01 |
|*  6 |      TABLE ACCESS FULL| TEST2 |     1 |    40 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------



使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
8#
发表于 2018-9-28 22:10 | 只看该作者
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> alter session set optimizer_features_enable='10.2.0.1';

Session altered.

SCOTT@test01p> SELECT a.t_id, a.t_name
  2      FROM test a
  3           LEFT JOIN (  SELECT t_id, t_name
  4                          FROM test2
  5                      GROUP BY t_name) b
  6              ON a.t_id = b.t_id AND a.t_name = b.t_name
  7     WHERE a.t_id = 1
  8  GROUP BY a.t_id, a.t_name;
      T_ID T_NAME
---------- --------------------------------------------------
         1 a

使用道具 举报

回复
论坛徽章:
194
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39奥运会纪念徽章:羽毛球
日期:2008-07-01 10:46:06奥运会纪念徽章:马术
日期:2008-07-07 17:43:24奥运会纪念徽章:射箭
日期:2008-07-25 18:07:39奥运会纪念徽章:皮划艇激流回旋
日期:2008-07-30 10:02:57奥运会纪念徽章:花样游泳
日期:2008-09-26 13:02:43奥运会纪念徽章:排球
日期:2008-12-03 11:23:272010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:澳大利亚
日期:2010-02-26 11:08:44
9#
发表于 2018-9-28 23:03 | 只看该作者
[20180928]如何能在11g下执行.txt

--//链接问的问题: http://www.itpub.net/thread-2105467-1-1.html

create table test(t_id int,t_name varchar2(50));
create table test2(t_id int,t_name varchar2(50));

insert into test values(1,'a');
insert into test values(2,'b');
insert into test values(3,'c');

insert into test2 values(1,'a');
insert into test2 values(2,'b');
insert into test2 values(3,'c');

SELECT a.t_id, a.t_name
    FROM test a
         LEFT JOIN (  SELECT t_id, t_name
                        FROM test2
                    GROUP BY t_name) b
            ON a.t_id = b.t_id AND a.t_name = b.t_name
   WHERE a.t_id = 1
GROUP BY a.t_id, a.t_name;

--//同样的sql ,在10g下就能执行,在11g下就会报错 ora-00979 不是group by 表达式。红色部分看起来确实是错的,可是10g下整句
--//执行就有结果。如何能做到这个语句再11g下也能执行呢。

--//家里没有10g,使用12c测试看看,这条语句明显错误(  SELECT t_id, t_name FROM test2 GROUP BY t_name),这里少写了 GROUP BY
--//t_id,t_name.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

2.测试:
SCOTT@test01p> select a.t_id,a.t_name from test a LEFT JOIN
  2  (select t_id,t_name from test2 group by t_name) b
  3  on a.t_id=b.t_id and a.t_name=b.t_name where a.t_id=1
  4  group by a.t_id,a.t_name;
(select t_id,t_name from test2 group by t_name) b
        *
ERROR at line 2:
ORA-00979: not a GROUP BY expression
--//12c 一样报错.

SCOTT@test01p> show parameter feature
NAME                                 TYPE                 VALUE
------------------------------------ -------------------- ---------------
optimizer_adaptive_features          boolean              TRUE
optimizer_features_enable            string               12.1.0.1

SCOTT@test01p> alter session set optimizer_features_enable='10.2.0.1';
Session altered.

SCOTT@test01p> SELECT a.t_id, a.t_name
  2      FROM test a
  3           LEFT JOIN (  SELECT t_id, t_name
  4                          FROM test2
  5                      GROUP BY t_name) b
  6              ON a.t_id = b.t_id AND a.t_name = b.t_name
  7     WHERE a.t_id = 1
  8  GROUP BY a.t_id, a.t_name;
      T_ID T_NAME
---------- --------------------------------------------------
         1 a

--//OK通过.不过这句话明显错误.看看执行计划:

SCOTT@test01p> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  0urvg3qakxxcx, child number 0
-------------------------------------
SELECT a.t_id, a.t_name     FROM test a          LEFT JOIN (  SELECT
t_id, t_name                         FROM test2
GROUP BY t_name) b             ON a.t_id = b.t_id AND a.t_name =
b.t_name    WHERE a.t_id = 1 GROUP BY a.t_id, a.t_name

Plan hash value: 1211648783

-----------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name  | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |        |       |     9 (100)|          |       |       |          |
|   1 |  HASH GROUP BY        |       |      1 |    40 |     9  (34)| 00:00:01 |  2063K|  2063K|  438K (0)|
|   2 |   VIEW                |       |      1 |    40 |     8  (25)| 00:00:01 |       |       |          |
|   3 |    HASH GROUP BY      |       |      1 |    92 |     8  (25)| 00:00:01 |  1345K|  1345K|  486K (0)|
|*  4 |     HASH JOIN OUTER   |       |      1 |    92 |     7  (15)| 00:00:01 |  1421K|  1421K|  722K (0)|
|*  5 |      TABLE ACCESS FULL| TEST  |      1 |    52 |     3   (0)| 00:00:01 |       |       |          |
|*  6 |      TABLE ACCESS FULL| TEST2 |      1 |    40 |     3   (0)| 00:00:01 |       |       |          |
-----------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$439AFB4F
   2 - SEL$3DD9CB74 / $vm_view_0@SEL$439AFB4F
   3 - SEL$3DD9CB74
   5 - SEL$3DD9CB74 / A@SEL$3
   6 - SEL$3DD9CB74 / TEST2@SEL$2

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('10.2.0.1')
      DB_VERSION('12.1.0.1')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$3DD9CB74")
      MERGE(@"SEL$2")
      OUTLINE_LEAF(@"SEL$439AFB4F")
      OUTLINE(@"SEL$F2B2F603")
      OUTLINE(@"SEL$2")
      OUTLINE(@"SEL$CD8351FA")
      MERGE(@"SEL$F1D6E378")
      OUTLINE(@"SEL$4")
      OUTLINE(@"SEL$F1D6E378")
      MERGE(@"SEL$1")
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$1")
      NO_ACCESS(@"SEL$439AFB4F" "$vm_view_0"@"SEL$439AFB4F")
      USE_HASH_AGGREGATION(@"SEL$439AFB4F")
      FULL(@"SEL$3DD9CB74" "A"@"SEL$3")
      FULL(@"SEL$3DD9CB74" "TEST2"@"SEL$2")
      LEADING(@"SEL$3DD9CB74" "A"@"SEL$3" "TEST2"@"SEL$2")
      USE_HASH(@"SEL$3DD9CB74" "TEST2"@"SEL$2")
      USE_HASH_AGGREGATION(@"SEL$3DD9CB74")
      END_OUTLINE_DATA
  */


Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("A"."T_NAME"="T_NAME" AND "A"."T_ID"="T_ID")
   5 - filter("A"."T_ID"=1)
   6 - filter("T_ID"=1)

--//抽取outline.

--//编辑如下:

begin
dbms_sqltune.import_sql_profile(
   name => 'profile_group_error',
   description => 'SQL profile created manually test',
   sql_text => q'[SELECT a.t_id, a.t_name
    FROM test a
         LEFT JOIN (  SELECT t_id, t_name
                        FROM test2
                    GROUP BY t_name) b
            ON a.t_id = b.t_id AND a.t_name = b.t_name
   WHERE a.t_id = 1
GROUP BY a.t_id, a.t_name]',
   profile => sqlprof_attr(
'IGNORE_OPTIM_EMBEDDED_HINTS',
q'[OPTIMIZER_FEATURES_ENABLE('10.2.0.1')]',
q'[DB_VERSION('12.1.0.1')]',
'ALL_ROWS',
'OUTLINE_LEAF(@"SEL$3DD9CB74")',
'MERGE(@"SEL$2")',
'OUTLINE_LEAF(@"SEL$439AFB4F")',
'OUTLINE(@"SEL$F2B2F603")',
'OUTLINE(@"SEL$2")',
'OUTLINE(@"SEL$CD8351FA")',
'MERGE(@"SEL$F1D6E378")',
'OUTLINE(@"SEL$4")',
'OUTLINE(@"SEL$F1D6E378")',
'MERGE(@"SEL$1")',
'OUTLINE(@"SEL$3")',
'OUTLINE(@"SEL$1")',
'NO_ACCESS(@"SEL$439AFB4F" "$vm_view_0"@"SEL$439AFB4F")',
'USE_HASH_AGGREGATION(@"SEL$439AFB4F")',
'FULL(@"SEL$3DD9CB74" "A"@"SEL$3")',
'FULL(@"SEL$3DD9CB74" "TEST2"@"SEL$2")',
'LEADING(@"SEL$3DD9CB74" "A"@"SEL$3" "TEST2"@"SEL$2")',
'USE_HASH(@"SEL$3DD9CB74" "TEST2"@"SEL$2")',
'USE_HASH_AGGREGATION(@"SEL$3DD9CB74")'
),
   replace => true,
   force_match => TRUE
);
end;
/


SCOTT@test01p> show parameter feature
NAME                                 TYPE                 VALUE
------------------------------------ -------------------- --------------
optimizer_adaptive_features          boolean              TRUE
optimizer_features_enable            string               12.1.0.1

SCOTT@test01p> SELECT a.t_id, a.t_name
  2      FROM test a
  3           LEFT JOIN (  SELECT t_id, t_name
  4                          FROM test2
  5                      GROUP BY t_name) b
  6              ON a.t_id = b.t_id AND a.t_name = b.t_name
  7     WHERE a.t_id = 1
  8  GROUP BY a.t_id, a.t_name;
      T_ID T_NAME
---------- --------------------------------------------------
         1 a

--//换1个数值,SELECT变成sELECT看看.

SCOTT@test01p> sELECT a.t_id, a.t_name
  2      FROM test a
  3           LEFT JOIN (  SELECT t_id, t_name
  4                          FROM test2
  5                      GROUP BY t_name) b
  6              ON a.t_id = b.t_id AND a.t_name = b.t_name
  7     WHERE a.t_id = 2
  8  GROUP BY a.t_id, a.t_name;
      T_ID T_NAME
---------- --------------------------------------------------
         2 b

--//OK解决,最好还是叫开发改代码..

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-18 09:29:11
10#
 楼主| 发表于 2018-11-15 10:29 | 只看该作者
lfree 发表于 2018-9-28 23:03
[20180928]如何能在11g下执行.txt

--//链接问的问题: http://www.itpub.net/thread-2105467-1-1.html

你太厉害了。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表