汉中| 龙游| 东西湖| 南昌县| 重庆| 十堰| 清水河| 修武| 保定| 乐业| 神木| 安龙| 肃北| 呼玛| 乌拉特后旗| 兴城| 临沭| 彭泽| 崇礼| 澎湖| 峨边| 湟中| 文县| 朝阳县| 赤城| 昂昂溪| 漳平| 孟连| 临漳| 淮北| 上思| 安平| 白朗| 都昌| 红安| 东明| 深州| 含山| 镇坪| 南充| 新泰| 宝山| 民勤| 松阳| 明溪| 长安| 深泽| 泽库| 定州| 景东| 偏关| 南沙岛| 高明| 岳池| 凭祥| 浮山| 宁强| 乌兰| 阳江| 乌苏| 无棣| 囊谦| 防城区| 建湖| 天长| 左贡| 蓝山| 同江| 汉源| 睢宁| 青海| 宿松| 永寿| 介休| 白云| 南充| 富裕| 盐山| 乌达| 巴南| 皋兰| 平阴| 浪卡子| 新荣| 宁国| 东兴| 巧家| 楚雄| 利川| 枣强| 垣曲| 巴东| 乐东| 门头沟| 铁山| 贡山| 建宁| 南川| 平安| 零陵| 定州| 永顺| 喀喇沁左翼| 凤凰| 宁陕| 阳西| 宾县| 肇州| 池州| 三原| 和平| 项城| 海原| 梁平| 满城| 阳朔| 武功| 神农架林区| 武都| 塔城| 江达| 麦积| 旺苍| 宿迁| 日照| 嘉黎| 宾阳| 普兰| 随州| 焉耆| 崇仁| 方正| 伊通| 万州| 梅县| 称多| 四平| 闵行| 长顺| 新沂| 杞县| 瑞安| 惠水| 独山| 边坝| 新平| 湘潭县| 岳池| 霍邱| 大城| 翁源| 潜江| 富拉尔基| 桦南| 罗平| 宝坻| 东港| 怀远| 延津| 乌当| 连平| 留坝| 柞水| 葫芦岛| 平鲁| 清远| 西宁| 滦县| 兴安| 临邑| 天祝| 合川| 辽阳市| 东阳| 黄山区| 索县| 隆安| 南宫| 周宁| 眉山| 大方| 交口| 韶关| 成县| 汉阳| 中宁| 德兴| 松原| 水富| 蚌埠| 广汉| 秦安| 密山| 醴陵| 防城港| 九台| 札达| 金沙| 莱阳| 沙湾| 四会| 明溪| 达孜| 吐鲁番| 蔚县| 代县| 黄埔| 易门| 忠县| 柘荣| 寿宁| 定襄| 宁蒗| 赵县| 道真| 井冈山| 兴文| 乌兰| 青州| 广饶| 新河| 南乐| 五峰| 八达岭| 牟平| 南江| 临朐| 鄂托克前旗| 上高| 贾汪| 牟定| 隆回| 射阳| 双流| 祁连| 和顺| 岳普湖| 磁县| 涟水| 潮安| 碾子山| 高密| 花莲| 大石桥| 海丰| 定南| 乌拉特后旗| 墨江| 乐清| 台南市| 岗巴| 凤山| 雷州| 溧水| 东安| 天水| 化州| 武定| 牟定| 六枝| 海林| 南沙岛| 达拉特旗| 乡城|

ITPUB论坛-中国最专业的IT技术社区

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

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

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

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

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

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

原始出处:
http://www.plsqlchallenge.com.bwp888.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-05-23';

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-05-23';

(C)
alter table qz_bricks move
  including rows where insert_date >= date'2018-05-23';
  
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-05-23';

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

alter table qz_bricks split partition p_def into (
  partition p_yellow values ( 'yellow' ), partition p_def
);
论坛徽章:
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-05-23 10:33:01秀才
日期:2018-05-23 10:03:12秀才
日期:2018-05-23 10:03:12秀才
日期:2018-05-23 10:03:12状元
日期:2018-05-23 10:04:09举人
日期:2018-05-23 10:04:09秀才
日期:2018-05-23 14:10:21秀才
日期:2018-05-23 14:10:21秀才
日期:2018-05-23 14:10:21秀才
日期:2018-05-23 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: 你可以在移动分区的同时过滤数据。

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

本版积分规则

-查岈山风景区论坛,查岈山风景区社区 - bwp888.com
DTCC2018购票6.8折优惠进行时

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

报名链接>>
金凤区论坛 荷兰园大马路论坛 建政街道论坛 陶乐论坛 猇亭区论坛
阿克苏地区论坛 辉南县论坛 天台县论坛 葫芦岛论坛 桂阳论坛
电子杂志 虎吧 老博客 读书频道 积分竞拍 文本模式 帮助
  IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
海沧区论坛 蓬溪县论坛 富源县论坛 万屋边论坛 东辽县论坛
和龙市论坛 芜湖县论坛 雁峰区论坛 沧浪区论坛 峨山县论坛