首页 > 2道Oracle的SQL面试题求解!!

2道Oracle的SQL面试题求解!!

create table test1
(id int primary key,
 name varchar(20),
 money int);

insert into test1 values(1,'Tom',1000);
insert into test1 values(2,'Mary',2000);
insert into test1 values(3,'Mike',3000);
insert into test1 values(4,'Jeff',4000);
commit;

注意:要求里面的MONEY1列并不是“MONEY列的结果-1000”,而是“MONEY1下一行的返回值是MONEY列当前行的返回值”。



建表语句: create table pm_ci (ci_id varchar(20) primary key, stu_ids varchar(100)); insert into pm_ci values('1','1,2,3,4'); insert into pm_ci values('2','1,4'); create table pm_stu (stu_id varchar(20) primary key, stu_name varchar(20)); insert into pm_stu values('1','张三'); insert into pm_stu values('2','李四'); insert into pm_stu values('3','王五'); insert into pm_stu values('4','赵六'); commit;


注意:第二题应该要用到行转列函数“wm_concat()”。

以上2题的SQL语句怎么写啊??

小弟新手……请哪位有空的牛人稍微指教一下好吗……?

请教大神给我个答案啊……最好能简单解说一下值得注意的地方~!先谢过了!


刚刚把题目的答案找出来了,共享一下,可能仅仅使用于这个题目的表数据,而缺乏健壮性,不过没有用到PLSQL,是单纯的SQL,供大家参考一下。


第一题 答案:

SELECT id,
  name,
  money,
  (SELECT money FROM test1 WHERE id=t.id-1
  ) money1
FROM test1 t;

这道题目使用了“相关子查询”,将主查询中的一个列作为子查询中的参数传递。
原先我用了多表查询来做这道题,没测试过对于这道题多表查询和子查询的方式哪种更快,有兴趣的网友可以试一下~


第二题 答案:

select ci_id,wm_concat(stu_name) namelist
from (select c.ci_id,s.stu_name
from pm_stu s,pm_ci c
where instr(c.stu_ids,s.stu_id) > 0)
group by ci_id;

这道题使用了“子查询(多行子查询)”和“多表连接查询(不等值连接)”。
大家可以先运行子查询语句,看看结果,然后就会发现,关键在于得到这个子查询语句的结果。然后利用wm_concat()函数转换一下结果就可以得到题目要求的结果了。
关键在于想出c.ci_id列和s.stu_name列之间的连接条件。


以上,本帖算是结束啦~


既然没人回答,那我就回答一下吧。

第一题比较简单, 无非表联结一下,把NULL值替换成空字符串:

SELECT
    test1.*,
    IFNULL(t1.money, '') AS money1
FROM test1
LEFT JOIN test1 t1 ON test1.id = t1.id + 1
ORDER BY id;

第二题,你只要知道并会使用find_in_set 和 group_concat两个函数基本就解决问题了

SELECT
    pm_ci.CI_ID,
    GROUP_CONCAT(pm_stu.STU_NAME)
FROM pm_ci
INNER JOIN pm_stu on FIND_IN_SET(pm_stu.STU_ID, pm_ci.STU_IDS)
GROUP BY pm_ic.CI_ID;
【热门文章】
【热门文章】