以下是PATIENT、PHYSICIAN和ADMISSION表的结果:
PATIENT | ||
PATIENT_ID | NUMBER | NOT NULL, Primary Key |
LAST_NAME | VARCHAR2(30) | NOT NULL |
FIRST_NAME | VARCHAR2(25) | NOT NULL |
DOB | DATE | |
INS_CODE | NUMBER |
PHYSICIAN | ||
PHYSICIAN_ID | NUMBER | NOT NULL, Primary Key |
LAST_NAME | VARCHAR2(30) | NOT NULL |
FIRST_NAME | VARCHAR2(25) | NOT NULL |
LICENSE_NO | NUMBER(7) | NOT NULL |
HIRE_DATE | DATE |
ADHISSION | ||
PATIENT_ID | NUMBER | NOT NULL, Primary Key, References PATIENT_ID column of the PATIENT table |
PHYSICIAN_ID | NUMBER | NOT NULL, Primary Key, References PHYSICIAN_ID column of the PHYSICIAN table |
ADMIT_DATE | DATE | |
DISCHG_DATE | DATE | |
ROOH_ID | NUHBER | Foreign key to ROOM_ID of the ROOM table |
A.一个分组函数
B.一个HAVING子句
C.一个MERGE语句
D.一个单行子查询
参考答案:D
解析: 这一题是测试对单行子查询的熟悉程度。根据有关WHERE子句中的单行子查询的介绍,可以确定选项D是正确的。实际上,选项D是子查询与主查询使用了两个不同的表,其查询语句可以如下:
SELECT patient_id
FROM PATIENT
WHERE admit_date>
(SELECT hire_date
FROM PHYSICIAN
WHERE PHYSICIAN ID=某个理疗师的ID);
因为分组函数(SUM、AVG、MIN、MAX和COUNT)无法显示某个理疗师(physician)被雇佣之后所有注册的病人(patient),所以选项A肯定可以排除。因为HAVING子句是用来限制分组之后的数据行的,所以选项B也肯定可以排除。
MERGE语句并未介绍过,其实即使不了解MERGE语句也可以正确地回答这一问题。下面简单地介绍一下MERGE语句:
MERGE语句是Oracle9i引入的一个DML语句,这个语句是为了将数据从一个表导入到另一表而设计的,其目的主要是支持数据仓库的操作。随着时间的流逝,在生产数据库中,一些大型表如订单表中的一些旧的订单在日常工作中已经很少使用,但是这些数据还可以用作商业智能的分析以帮助管理者快速地做出正确的决策,因此就需要将这些数据从生产表中转移到数据仓库表中。大型和超大型公司可能有许多DBA,因此在进行这类数据转移操作时,很难确定之前是否有其他的DBA已经完成了这样工作(也可能自己忘了)。在这种情况下,可以使用MERGE语句。
MERGE语句的操作是这样的。如果将数据导入目标表时,数据已经存在,则执行UPDATE(更新)操作,否则就执行INSERT(插入)操作,这样就不会出现一行数据被多次插入的现象。基于以上的介绍,可以肯定选项C不可能是正确的。