- 第一题
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;