|
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'
/
|
|