• http://www.nn268.com
  • ITPUB论坛-中国最专业的IT技术社区

     找回密码
     注册
    查看: 866|回复: 2

    [每日一题] PL/SQL Challenge 每日一题:2018-07-20 表分区(12.2)

    [复制链接]
    论坛徽章:
    486
    秀才
日期:2018-07-20 10:33:01秀才
日期:2018-07-20 10:03:12秀才
日期:2018-07-20 10:03:12秀才
日期:2018-07-20 10:03:12状元
日期:2018-07-20 10:04:09举人
日期:2018-07-20 10:04:09秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21
    跳转到指定楼层
    1#
    发表于 2018-1-4 04:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

    每两周的优胜者可获得itpub奖励的技术图书一本。

    以往旧题索引:
    http://www-itpub-net.cg718.com/forum.php?m ... eid&typeid=1808

    原始出处:
    http://www.plsqlchallenge.com.cg718.com/

    作者: Chris Saxon

    运行环境:SQLPLUS, SERVEROUTPUT已打开
    注:本题给出答案时候要求给予简要说明才能得到奖品

    注:本题执行环境为12.2或更高

    你在这张表中保存着你的砖块数据:

    create table qz_bricks (
      brick_id    integer not null constraint qz_bricks_pk primary key,
      shape       varchar2(30) not null,
      colour      varchar2(30) not null,
      insert_date date not null
    ) partition by list ( colour ) (
      partition p_red   values ( 'red' ),
      partition p_green values ( 'green' ),
      partition p_blue  values ( 'blue' ),
      partition p_def   values ( default )
    );

    目前,每个分区中存储的数据按trunc ( insert_date, 'y' )分组是这么多:

    SUBOBJECT_ TRUNC(INSER   COUNT(*)
    ---------- ----------- ----------
    P_BLUE     01-JAN-2016        150
    P_BLUE     01-JAN-2017        100
    P_DEF      01-JAN-2016        150
    P_DEF      01-JAN-2017        200
    P_GREEN    01-JAN-2016        150
    P_GREEN    01-JAN-2017        100
    P_RED      01-JAN-2016        150
    P_RED      01-JAN-2017        100

    缺省分区(P_DEF)包含许多不同的颜色。但是你最近买了100个黄色的砖块。你想要将这些从缺省分区中分离出去。同时,你想要去掉2017以前的砖块,但是仅仅是从缺省分区(P_DEF)和黄色分区中去除。

    下列哪些选项:

    将p_def分区分裂成 p_yellow 和 p_def
    从这两个分区中去除那些插入日期在2017之前的?

    例如,在选项执行之后,这个查询的输出:

    select uo.subobject_name, trunc( insert_date, 'y' ), count(*)
    from   user_objects uo,
           qz_bricks x
    where  uo.data_object_id = dbms_rowid.rowid_object(x.rowid)
    group  by uo.subobject_name, trunc( insert_date, 'y' )
    order  by 1 , 2;

    必须是:


    SUBOBJECT_ TRUNC(INSER   COUNT(*)
    ---------- ----------- ----------
    P_BLUE     01-JAN-2016        150
    P_BLUE     01-JAN-2017        100
    P_DEF      01-JAN-2017        100
    P_GREEN    01-JAN-2016        150
    P_GREEN    01-JAN-2017        100
    P_RED      01-JAN-2016        150
    P_RED      01-JAN-2017        100
    P_YELLOW   01-JAN-2017        100

    假设 SQL*Plus 设置如下:

    col subobject_name format a10
    alter session set nls_date_format = 'DD-MON-YYYY';

    (A)
    delete qz_bricks partition ( p_def )
    where insert_date < date'2018-07-20';

    alter table qz_bricks split partition p_def into (
      partition p_yellow values ( 'yellow' ), partition p_def
    );

    (B)
    alter table qz_bricks split partition p_def into (
      partition p_yellow values ( 'yellow' ), partition p_def
    ) including rows where insert_date >= date'2018-07-20';

    (C)
    alter table qz_bricks move
      including rows where insert_date >= date'2018-07-20';
      
    alter table qz_bricks split partition p_def into (
      partition p_yellow values ( 'yellow' ), partition p_def
    );

    (D)
    alter table qz_bricks split partition p_def into (
      partition p_yellow values ( 'yellow' ), partition p_def
    ) delete rows where insert_date < date'2018-07-20';

    (E)
    alter table qz_bricks move partition p_def
      including rows where insert_date >= date'2018-07-20';

    alter table qz_bricks split partition p_def into (
      partition p_yellow values ( 'yellow' ), partition p_def
    );
    标签:抢着
  • http://www.tzaohua.com
  • 丰收糖业集团有限公司虚拟镇

    使用道具 举报

    回复
    论坛徽章:
    0
    2#
    发表于 2018-1-4 18:05 | 只看该作者
    正确的应该是A B E.
    A: 先通过delet语句删除p_def分区表中2017以前的砖块,然后再拆分p_def分区表;
    B: 对p_def进行拆分,拆分的结果限定在2017以前的砖块,其余的数据被移除;
    C:首先删除数据的已经错了,没有区别分区表。结果就是将所有分区的不符合要求数据清除了;
    D:delete语法错误;
    E:效果等同于A。
    论坛徽章:
    486
    秀才
日期:2018-07-20 10:33:01秀才
日期:2018-07-20 10:03:12秀才
日期:2018-07-20 10:03:12秀才
日期:2018-07-20 10:03:12状元
日期:2018-07-20 10:04:09举人
日期:2018-07-20 10:04:09秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21秀才
日期:2018-07-20 14:10:21
    3#
     楼主| 发表于 2018-1-5 04:14 | 只看该作者
    答案ABE, 2楼得奖。

    A: 它首先从缺省分区删除了插入日期在2017之前的数据行,然后将黄色值分裂为一个单独的分区。
    B: (推荐)
    "including rows" 子句是12.2的新功能。它允许你在分区维护操作中过滤数据。所以仅仅插入日期从2017起的数据会保留在两个分区中。
    C: 你在移动表的时候也可以过滤数据。但是你不能移动一个分区表!仅可以移动里面的分区。所以这个move操作会报错:
    "ORA-14511: cannot perform operation on a partitioned object".
    D: 过滤分区数据的子句是 "including rows"。Delete rows是无效的。所以这会报错:
    "ORA-14126: only a <parallel clause> may follow description(s) of resulting partitions"
    E: 你可以在移动分区的同时过滤数据。

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

    本版积分规则

    -福星村论坛,福星村社区 - cg718.com
    DTCC2018购票6.8折优惠进行时

    中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
    ----------------------------------------
    优惠时间:2018-07-20前

    报名链接>>
    高台县论坛 祐汉新村第二街论坛 鹤岗市论坛 如东县论坛 岑巩县论坛
    西安区论坛 千山区论坛 凤里街道论坛 道里区论坛 奇莱主山论坛
    电子杂志 虎吧 老博客 读书频道 积分竞拍 文本模式 帮助
      IT博客
      ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
    CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
    京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
      
    快速回复 返回顶部 返回列表
    伯林街论坛 饶平县论坛 林茂海边大马路论坛 通辽论坛 花瓶屿论坛
    堎底下镇论坛 大汉溪论坛 囊谦县论坛 淮阴区论坛 通渭县论坛