sql面试

1、  在表A中存在一部分记录,主键是重复的,将重复的主键删除,只保留改主键的第一条记录

假设表A的数据如下:



ID NAME NAME2 NAME3

1
A    
2 A    
3 B    
4 B    
5 C    



处理后表A的数据如下:


ID
NAME NAME2 NAME3
1
A
    
2 B    
3 C    



答案:

delete test t1
where t1.rowid !=
(
   select max(t2.rowid) from test t2
   where t2.id = t1.id
)



2、请写出数据库关联更新的SQL,用B表的数据去更新A表,要求主键对应。

假设表A的数据如下:





ID

NAME
NAME2 NAME3

1

A






2

B






3

C








表B的数据如下:





ID

NAME2

NAME3


1

南京

1


2

北京

2


4

上海

3


更新表A后的结果如下:





ID

NAME1

NAME2

NAME3


1

A

南京

1


2

B

北京

2


3

C






要求sql要考虑通用情况,使用表中的任何数据,而不能删除A表中任何一行数据。



update test t1 set(t1.f2,t1.f3) = (select t2.f2,t2.f3 from test2 t2 where t1.id = t2.id)




3、有如下A、B两个表,如何将A表的数据查询出来,结果如B所示?

         A表:


姓名

科目

分数


张三

语文

87


李四

数学

98


张三

英语

74


张三

数学

95


李四

语文

80


李四

英语

98




         B表:


姓名

语文

数学

英语

总分


张三










李四












思路:



1:先需要想到行转列函数 decode 或 case



select a.name 姓名,
        (case
          when course = '语文' then
           score
        end) 语文,
        (case
          when course = '英语' then
           score
        end) 英语,
        (case
          when course = '数学' then
           score
        end) 数学,
        score
   from test a
  order by a. name desc;



2:想到求列的总和(想到sum语句)

select a.name 姓名,
       sum(decode(course, '语文', score)) 语文,
       sum(decode(course, '数学', score)) 数学,
       sum(decode(course, '英语', score)) 英语,
       sum(score) 总分
  from test a
group by a.name
order by a. name desc;



另外一种方法(不推荐)

select a.name 姓名,
       sum(case
             when course = '语文' then
              score
           end) 语文,
       sum(case
             when course = '英语' then
              score
           end) 英语,
       sum(case
             when course = '数学' then
              score
           end) 数学,
       b.total 总分
  from test a, (select name, sum(score) total from test group by name) b
where a.name = b.name
group by a.name, b.total
order by a. name desc;



      另外一个相似题目:
        有两张关联的表A、B
         A:  id   acount  pay_id               B:   pay_id  B_acount
              1     100      1                             1        0
              2     200      2                             2        0
              3     200      1                     
          要求,更新表B,使得B_acount的值等于表A中对应的pay_id的所有acount之和。打印如下:
             B:  pay_id     B_acount
                        1             300
                        2             200
------------------------------------------------------------------
        update B  
        inner join A on B.pay_id = A.pay_id  
        set b_acount= 
       (select sum(acount)  from A where A.pay_id=B.pay_id)



4:首先是需要对表做一个规划,即必须有自己的ID和ID对应这条记录的PID(父ID)。
简单的数据结构如下
id    pid
1      0 
2      0 
3      1 
4      1 
5      2 
6      2 
7      3 
8      4 
9      5 
比如你现在需要取出ID是1的以及其下所有的记录,如:
id pid 
1  0 
3  1 
4  1 
7  3 
8  4

查询语句如下:
select *
  from TEST
start with id = 1
connect by prior id = pid
order by id asc

如果有条件语句,比如where or when,其语句放在 start with前面



5:MERGE的用法



create table TEST
(
  ID   NUMBER,
  NAME VARCHAR2(100),
  PID  NUMBER default 0
)



      MERGE INTO test D
      USING (SELECT 1 id FROM dual) S
      ON (S.id = D.id)
      WHEN MATCHED THEN
        UPDATE SET D.name = 'aaA' where D.Id = 1
      WHEN NOT MATCHED THEN
        INSERT (d.id, D.name, d.pid) VALUES (1, 'A', 0)



参考:

   第三题的题目参考自  http://haohaoxuexi.iteye.com/blog/1820541

猜你喜欢

转载自gaobaoxiong.iteye.com/blog/1837684