壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2567|回复: 9

昨天的几道笔试题

  [复制链接]
发表于 2008/7/2 17:52:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
1,现有表bill和表payment结构如下,两表通过pay_id关联:
bill表――bill_id是帐单标识,charge为帐单金额,pay_id为付款编号,PK:bill_id
bill_id INTEGER
charge INTEGER
pay_id INTEGER

payment表――pay_id为付款编号,charge为付款金额,PK:pay_id
pay_id INTEGER
charge INTEGER

要求更新payment使charge=bill表中同一pay_id的charge之和。

2、有如下信息:
起始地  目的地  距离(公里)
A   B   1000
A   C   1100
A   D   900
A   E   400
B   D   300
D   F   600
E   A   400
F   G   1000
C   B   600
请用SQL语句或一段代码写出从A出发,可达到的目的地(包括间接方式)。


3.表A定义如下:
属性    类型    备注
Id  Integer PK
Name    Varchar(30)
State   char(3)
表A中现有1000万条记录,如果客户端要通过分页的方式从表A中取数据,其中每页20条
记录,有几种方法?描述每种方法如何处理,有什么优缺点?用SQL写出实现代码


4、表A定义如下:
属性    类型
Year    Integer
Quarter Varchar(30)
Amount  float

Year    Quarter Amount
2000    1   1.1
2000    2   1.2
2000    3   1.3
2000    4   1.4
2001    1   2.1
2001    2   2.2
2001    3   2.3
2001    4   2.4
其中每行表表示一个季度的数据。

如果处理表A中的数据,得到如下的结果。
Year    Quarter1    Quarter2    Quarter3    Quarter4
2000    1.1           1.2          1.3        1.4
2001    2.1           2.2          2.3        2.4
请用SQL写一段代码实现。
 楼主| 发表于 2008/7/2 17:52:44 | 显示全部楼层
4.
select year,
sum(decode(Quarter, 1, amount, 0)) Quarter1,
sum(decode(Quarter, 2, amount, 0)) Quarter2,
sum(decode(Quarter, 3, amount, 0)) Quarter3,
sum(decode(Quarter, 4, amount, 0)) Quarter4
from A
group by year;
 楼主| 发表于 2008/7/2 17:52:52 | 显示全部楼层
2,select 目的地
from 表A
where 目的地 <> A
start with 起始地 = A
connect by prior 起始地 = 目的地
 楼主| 发表于 2008/7/2 17:53:02 | 显示全部楼层
第二题
报错ORA-01436: CONNECT BY loop in user data
看过论坛的贴子,改成
select 目的地 ,CONNECT_BY_ISCYCLE
from 表A
where 目的地 <> A
start with 起始地 = A
connect by NOCYCLE  prior 起始地 = 目的地;
还是报错ORA-00920: invalid relational operator
 楼主| 发表于 2008/7/2 17:53:15 | 显示全部楼层
1
update payment set charge = (select sum(b.charge) from bill b where b.pay_id = payment.pay_id )
where pay_id in (select bi.pay_id from bill bi group by bi.pay_id);
 楼主| 发表于 2008/7/2 17:53:27 | 显示全部楼层
SQL> select * from t;

C C       COL3
- - ----------
A B       1000
A C       1100
A D        900
A E        400
B D        300
D F        600
E A        400
F G       1000
C B        600

9 rows selected.

SQL> @aaa.sql
SQL> col sybp format a60
SQL> set pagesize 20
SQL> select col1,col2,col3,ltrim(sys_connect_by_path(col1,'->')||'->'||col2,
) sybp
  2  from (
  3    select * from t
  4    where col2 <> 'A'
  5  )
  6  start with col1 = 'A'
  7  connect by prior col2 = col1
  8  /

C C       COL3 SYBP
- - ---------- ------------------------------------------------------------
A B       1000 A->B
B D        300 A->B->D
D F        600 A->B->D->F
F G       1000 A->B->D->F->G
A C       1100 A->C
C B        600 A->C->B
B D        300 A->C->B->D
D F        600 A->C->B->D->F
F G       1000 A->C->B->D->F->G
A D        900 A->D
D F        600 A->D->F
F G       1000 A->D->F->G
A E        400 A->E

13 rows selected.

SQL>
 楼主| 发表于 2008/7/2 17:53:45 | 显示全部楼层
SQL> select * from tbs;
A     B              C
----- ----- ----------
A     B           1000
A     C           1100
A     D            900
A     E            400
B     D            300
D     F            600
E     A            600
F     G            600
C     B            600

9 rows selected
SQL> SELECT *
  2    from (SELECT * FROM tbs where B <> 'A')
  3   start with A = 'A'
  4  connect by A = prior B ;

A     B              C
----- ----- ----------
A     B           1000
B     D            300
D     F            600
F     G            600
A     C           1100
C     B            600
B     D            300
D     F            600
F     G            600
A     D            900
D     F            600
F     G            600
A     E            400

13 rows selected
 楼主| 发表于 2008/7/2 17:53:57 | 显示全部楼层
1:
CREATE OR REPLACE TRIGGER SCOTT.TR_SEC_BILL
AFTER INSERT OR DELETE OR UPDATE
ON SCOTT.BILL
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
  v_temp number(9);
begin
     case
        when INSERTING then
                select count(*) into v_temp from payment where pay_id = :new.pay_id;
                if v_temp = 0 then
                        insert into payment values(:new.pay_id,0);
                end if;
                update payment set charge = charge + :new.charge where pay_id = :new.pay_id;
        when UPDATING then
                update payment set charge = charge + :new.charge - ld.charge where pay_id = :new.pay_id;
        when DELETING then
                update payment set charge = charge - :old.charge where pay_id = :old.pay_id;
      end case;
end;
/
UID106696 帖子11 精华0 积分11 流通积分11 点 金钱0 O元 阅读权限20 在线时间0 小时 注册时间2005-7-4 最后登录1970-1-1 查看详细资料
引用 使用道具 报告 回复 TOP
发表于 2011/5/19 18:32:44 | 显示全部楼层
有意思,研究一下。
发表于 2011/5/19 19:36:47 | 显示全部楼层
什么公司面试这些题目啊。不是很难啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 21:19 , Processed in 0.017172 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表