楼主: newkid

SQL 小测验每周一题

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
141#
 楼主| 发表于 2011-12-20 00:53 | 只看该作者
2011-12-10 答案B.
A: 它指定的窗口范围是 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING,其实就是整个PARTITION (整个部门)的合计。
B: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW正确地实现了截至当前行为止的小计。
C: 没有写窗口子句,缺省是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,即取值范围截至当前行的值为止,因为里面有两条工资相等,这两条会被同时计入,而不是逐行计入。
D: ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING是从当前行往后,不符合题目要求。
-------------------------------------------
2011-12-17 UPDATE语句(内联视图,相关查询)
作者:Darryl Hurley
难度:中

执行如下代码:
CREATE TABLE plch_parts (
   partnum NUMBER
, partname VARCHAR2(10)
, partprice NUMBER )
/

INSERT INTO plch_parts VALUES(1, 'Part 1', 1);
INSERT INTO plch_parts VALUES(2, 'Part 2', 2);
COMMIT;

下列的哪些UPDATE语句,会导致此查询执行之后:
SELECT *
  FROM plch_parts
ORDER BY partnum
/

产生如下的结果:
    PARTNUM PARTNAME    PARTPRICE
---------- ---------- ----------
         1 Part 1              1
         2 Part 2              4

(A)
UPDATE plch_parts
   SET partprice = partprice * 2
WHERE MOD (partnum, 2) = 0

(B)
UPDATE ( SELECT *
           FROM plch_parts
          WHERE MOD (partnum, 2) = 0 )
   SET partprice = partprice * 2
   
(C)
UPDATE plch_parts a
   SET a.partprice = ( SELECT b.partprice * 2
                         FROM plch_parts b
                        WHERE a.partnum = b.partnum )
WHERE MOD (a.partnum, 2) = 0

(D)
UPDATE plch_parts a
   SET a.partprice = ( SELECT b.partprice * 2
                         FROM plch_parts b
                        WHERE a.partnum = b.partnum
                          AND MOD (a.partnum, 2) = 0 )
                          

使用道具 举报

回复
论坛徽章:
13
2010新春纪念徽章
日期:2010-03-01 11:04:59技术图书徽章
日期:2018-03-01 10:21:49秀才
日期:2018-03-01 10:21:252015年新春福章
日期:2015-03-06 11:58:18喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:56:01
142#
发表于 2011-12-20 09:05 | 只看该作者
答安是ABC, 感觉 D 是不对的, 但是说不出道理

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
143#
 楼主| 发表于 2011-12-27 10:11 | 只看该作者
2011-12-17 答案ABC
D: 错误地修改了所有的行,因为外层的UPDATE没有带WHERE条件。

==================================================
2011-12-24 MERGE语句
作者:Jeff Kemp
难度:中

我创建了两张表并填入一些数据:
CREATE TABLE plch_empdept
( empid NUMBER NOT NULL
, deptid NUMBER NOT NULL
, CONSTRAINT plch_empdept_pk PRIMARY KEY (empid, deptid)
);

CREATE TABLE plch_newrecs
( empid    NUMBER NOT NULL
, deptid   NUMBER NOT NULL
, deleteme CHAR(1) NOT NULL
, CONSTRAINT plch_newrecs_pk PRIMARY KEY (empid, deptid)
);

INSERT INTO plch_empdept VALUES (10, 100);
INSERT INTO plch_empdept VALUES (10, 200);

INSERT INTO plch_newrecs VALUES (10, 200, 'Y');
INSERT INTO plch_newrecs VALUES (10, 300, 'N');
INSERT INTO plch_newrecs VALUES (10, 400, 'Y');

COMMIT;

然后我执行了一些SQL(即下列的每个答案),目的是向 plch_empdept 表加入数据, 来源是 plch_newrecs 表中的deleteme等于'N' 的数据(假如数据在plch_empdept中已经存在则不修改), 如果 plch_newrecs的deleteme等于'Y'则从 plch_empdept删去相应数据。对应关系由组合键(empid, deptid)决定。

然后运行如下查询:
SELECT * FROM plch_empdept ORDER BY deptid

哪些选项提供的SQL语句能够 (a)执行不出错,并且(b)上述查询输出下列的结果:
EMPID  DEPTID
-----  ------
   10     100
   10     300

(A)
MERGE INTO plch_empdept
     USING (SELECT * FROM plch_newrecs) src
        ON (    plch_empdept.empid = src.empid
            AND plch_empdept.deptid = src.deptid)
WHEN MATCHED
THEN
   UPDATE SET
      plch_empdept.empid = src.empid
    , plch_empdept.deptid = src.deptid
   DELETE
           WHERE src.deleteme = 'Y'
WHEN NOT MATCHED
THEN
   INSERT     (empid, deptid)
       VALUES (src.empid, src.deptid)
        WHERE src.deleteme = 'N'
/

(B)
DELETE plch_empdept
WHERE (empid, deptid) IN (SELECT empid, deptid
                             FROM plch_newrecs
                            WHERE deleteme = 'Y')
/                           

INSERT INTO plch_empdept (empid, deptid)
   SELECT empid, deptid
     FROM plch_newrecs
    WHERE deleteme = 'N'
   MINUS
   SELECT empid, deptid FROM plch_empdept
/   
   
(C)
DELETE plch_empdept
WHERE (empid, deptid) IN (SELECT empid, deptid
                             FROM plch_newrecs
                            WHERE deleteme = 'Y')
/                           

MERGE INTO plch_empdept
     USING (SELECT * FROM plch_newrecs) src
        ON (    plch_empdept.empid = src.empid
            AND plch_empdept.deptid = src.deptid)
WHEN NOT MATCHED
THEN
   INSERT     (empid, deptid)
       VALUES (src.empid, src.deptid)
        WHERE src.deleteme = 'N'
/

(D)
MERGE INTO plch_empdept
     USING (SELECT * FROM plch_newrecs) src
        ON (    plch_empdept.empid = src.empid
            AND plch_empdept.deptid = src.deptid)
WHEN MATCHED
THEN
   DELETE WHERE src.deleteme = 'Y'
WHEN NOT MATCHED
THEN
   INSERT     (empid, deptid)
       VALUES (src.empid, src.deptid)
        WHERE src.deleteme = 'N'
/

使用道具 举报

回复
论坛徽章:
13
2010新春纪念徽章
日期:2010-03-01 11:04:59技术图书徽章
日期:2018-03-01 10:21:49秀才
日期:2018-03-01 10:21:252015年新春福章
日期:2015-03-06 11:58:18喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:56:01
144#
发表于 2011-12-30 09:41 | 只看该作者
答案 C

使用道具 举报

回复
论坛徽章:
3
鲜花蛋
日期:2011-07-05 17:12:112012新春纪念徽章
日期:2012-01-04 11:54:46优秀写手
日期:2013-12-18 09:29:13
145#
发表于 2011-12-30 10:03 | 只看该作者
BCD?

使用道具 举报

回复
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:53:29紫蛋头
日期:2012-05-03 20:22:49
146#
发表于 2011-12-30 12:00 | 只看该作者
俺又落武了,学习吧

使用道具 举报

回复
论坛徽章:
142
秀才
日期:2016-01-06 14:01:09秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56秀才
日期:2016-03-24 09:10:24秀才
日期:2016-03-24 09:20:52秀才
日期:2016-04-21 14:08:53秀才
日期:2016-04-21 14:11:59
147#
发表于 2011-12-30 15:07 | 只看该作者
A肯定不对,格式都错了。

B,C,D

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
148#
 楼主| 发表于 2012-1-5 03:22 | 只看该作者
2011-12-24 答案BC.

A: MERGE语句的匹配列(即ON后面的列)是不可以修改的。
D: MATCHED里面单独的DELETE目前还不支持,必须和UPDATE一起使用。这个一点道理也没有,希望ORACLE以后能改进。
=========================================
2011-12-31 NUMBER型的存储
作者:_Nikotin
难度:中

我在自己的schema中创建了PLCH_NUMBERS表并插入大量数据:
create table plch_numbers (n number) pctfree 0;

insert into plch_numbers select 1 from dual connect by level <= 1e5;
commit;

然后我又运行了选项中的update语句。
/* update */

commit;


然后我检查plch_numbers表的大小:
select blocks from user_segments where segment_name = 'PLCH_NUMBERS';

哪个选项的UPDATE会使得这个查询返回的值最大?


(A)
update plch_numbers set n = n / 2

(B)
update plch_numbers set n = n / 3

(C)
update plch_numbers set n = n / 5

(D)
update plch_numbers set n = n / 10

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
149#
发表于 2012-1-5 07:04 | 只看该作者
newkid 发表于 2012-1-5 03:22
2011-12-24 答案BC.

A: MERGE语句的匹配列(即ON后面的列)是不可以修改的。

b,因为1/3除不尽

使用道具 举报

回复
论坛徽章:
13
2010新春纪念徽章
日期:2010-03-01 11:04:59技术图书徽章
日期:2018-03-01 10:21:49秀才
日期:2018-03-01 10:21:252015年新春福章
日期:2015-03-06 11:58:18喜羊羊
日期:2015-03-04 14:52:46优秀写手
日期:2014-04-22 06:00:18马上有对象
日期:2014-02-18 16:44:082014年新春福章
日期:2014-02-18 16:44:082013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-01-04 11:56:01
150#
发表于 2012-1-5 07:26 | 只看该作者
答案 B

使用道具 举报

回复

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

本版积分规则 发表回复

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