查看: 291|回复: 1

[每日一题] PL/SQL Challenge 每日一题:2020-10-7 检查约束

[复制链接]
论坛徽章:
527
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-10-17 00:58 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

原始出处:
https://devgym.oracle.com/

作者:Chris Saxon

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

你创建了一张表并且装载了数据来存储一个“蛇与梯子”游戏的棋盘:
(关于游戏参见:
https://en.wikipedia.org/wiki/Sn ... 0known%20originally,connecting%20two%20specific%20board%20squares.
)

create table qz_snakes_ladders_board (
  square integer
    not null
    primary key,
  square_type varchar2(20)
    check (
      square_type in (
        'LADDER_BOTTOM', 'SNAKE_TOP'
      )
    ),
  move_to_square
    references qz_snakes_ladders_board ( square )
);

insert into qz_snakes_ladders_board ( square )
with rws as (
  select level square from dual
  connect by level <= 100
)
  select square from rws;

commit;

根据规则,MOVE_TO_SQUARE的值:

在square_type为LADDER_BOTTOM的情况下必须大于 SQUARE 的值
在square_type为SNAKE_TOP的情况下必须小于 SQUARE 的值
其他情况下必须为NULL

哪些选项可以用来取代如下的 ##REPLACE## 部分:

alter table qz_snakes_ladders_board
  add constraint qz_slbo_ladder_c
  check ( ##REPLACE## );
  
使得这个约束被加入之后,再执行这些UPDATE语句:
前两个必须成功
后三个必须引发异常
查询能够返回所示的结果?

/* 成功 */
update qz_snakes_ladders_board
set    ( square_type , move_to_square ) =
         ( select 'LADDER_BOTTOM', 15 from dual )
where  square = 3;
update qz_snakes_ladders_board
set    ( square_type , move_to_square ) =
         ( select 'SNAKE_TOP', 2 from dual )
where  square = 99;

/* 失败 */
update qz_snakes_ladders_board
set    ( square_type , move_to_square ) =
         ( select 'LADDER_BOTTOM', 43 from dual )
where  square = 67;
update qz_snakes_ladders_board
set    ( square_type , move_to_square ) =
         ( select 'SNAKE_TOP', 73 from dual )
where  square = 25;
update qz_snakes_ladders_board
set    move_to_square = 19
where  square = 50;


select s.*
from   qz_snakes_ladders_board s
where  square in ( 3, 99, 25, 67, 50 )
order  by square;

    SQUARE SQUARE_TYPE          MOVE_TO_SQUARE
---------- -------------------- --------------
         3 LADDER_BOTTOM                    15
        25 <null>               <null>
        50 <null>               <null>
        67 <null>               <null>
        99 SNAKE_TOP                         2

(A)
case
  when square_type = 'LADDER_BOTTOM' then
    -move_to_square
  when square_type = 'SNAKE_TOP' then
    move_to_square
end < square

(B)
( square_type = 'LADDER_BOTTOM' and square < move_to_square ) or
( square_type = 'SNAKE_TOP' and move_to_square < square ) or
move_to_square is null

(C)
( nvl ( square_type, 'X' ) = 'LADDER_BOTTOM' and square < move_to_square ) or
( nvl ( square_type, 'X' ) = 'SNAKE_TOP' and move_to_square < square ) or
move_to_square is null

(D)
not ( lnnvl ( square_type = 'LADDER_BOTTOM' ) or lnnvl ( square < move_to_square ) ) or
not ( lnnvl ( square_type = 'SNAKE_TOP' ) or lnnvl ( move_to_square < square ) ) or
move_to_square is null

论坛徽章:
536
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2020-10-24 12:26 | 显示全部楼层

答案:CD
A: 当 square_type = 'LADDER_BOTTOM',MOVE_TO_SQUARE必须大于 square, 这里取负值 -move_to_square,那为正值就更小了
B: 逻辑表达简单易懂,但没有处理 square_type为 NULL,move_to_square必须为NULL
C: 运用NVL保证了 square_type为 NULL,move_to_square必须为NULL,纠正了B
D: 这个逻辑写法看着好难理解,LNNVL本来就是对条件包括空和未知来取否定,再加上逻辑反演律,与C等价

使用道具 举报

回复

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

本版积分规则 发表回复

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