多选题
以下是客户(CUSTOMER)表和客户_订单(CURR_ORDER)表的结构: CUSTOMER ------------------------------------ CUSTOMER_ID NUMBER(5) NAME VARCHAR2(25) CREDIT_LIMIT NUMBER(8, 2) ACCT_OPEN_DATE DATE CURR_ORDER ------------------------------------ ORDER_ID NUMBER(5) CUSTOMER_ID NUMBER(5) ORDER_DATE DATE TOTAL NUMBER(8, 2) 以下哪种情况下应该使用子查询来返回所需的结果? A.需要显示今天下了订单的全部客户的名字 B.需要确定CUSTOMER_ID为30450的客户今年所下的订单数量 C.需要确定今年开了账号的所有客户的平均信用限额(CREDIT_LIMIT) D.需要确定那些信用限额比CUSTOMER_ID为30450的客户的信用限额高(大)的客户
【正确答案】
D
【答案解析】[解析] 这一题比较复杂,该题测试对单行子查询的熟悉程度(在这一题中实际上是寻找最佳的答案)。根据有关WHERE子句中的单行子查询的介绍,可以确定选项D是正确的答案。选项D其查询语句可以如下: SELECT CUSTOMER_ID, name FROM CUSTOMER WHERE CREDIT_LIMIT> (SELECT CREDIT_LIMIT FROM CUSTOMER WHERE CUSTOMER_ID=30450); 因为今天下了订单的全部客户的名字的操作可以使用连接操作来完成,所以选项A可以排除,其查询语句可以如下: SELECT CUSTOMER_ID, name FROM CUSTOMER C, CURR_ORDER O WHERE C.CUSTOMER_ID=O.CUSTOMER_ID AND O.ORDER_DATE=SYSDATE; 因为确定CUSTOMER_ID为30450的客户今年所下的订单数量的操作根本就不需要子查询,所以选项B同样也可以排除。其查询语句可以如下: SELECT COUNT(TOTAL) FROM CURR_ORDER WHERE CUSTOMER_ID=30450 AND ORDER_DATE>=TRUNC(SYSDATE, 'YEAR'); 因为确定今年开了账号的所有客户的平均信用限额同样不需要子查询,所以选项C也可以排除。其查询语句可以如下: SELECT avg(CREDIT_IMIT) FROM CUSTOMER C, CURR_ORDER O WHERE C.CUSTOMER_ID=O.CUSTOMER_ID AND ORDER_DATE>=TRUNC(SYSDATE, 'YEAR');