12
返回列表 发新帖
楼主: lwxxrq

[笔记] 这道SQL的题难倒了我

[复制链接]
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
11#
 楼主| 发表于 2005-1-19 13:15 | 只看该作者
厉害!还知道在sqlserver等其它数据库里怎么实现么?

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2005-1-19 15:53 | 只看该作者
我有PL/SQL可是!!
           KEY        BR        LENT
1        A001        10        0
2        A002        0        10
3        A003        10        0
4        A004        0        10
5        A005        0        10
6        A006        20        0
7        A007        0        20
8        A008        20        0
9        A009        30        0
10        A010        0        30
11        A011        40        0
12        A012        0        50
13        A013        58        0
14        A014        0        51
15        A015        21        0
16        A016        0        58
17        A017        51        0
PL/SQL 语句
declare
  
  i integer;
  CURSOR C_BR IS
  SELECT KEY,
         BR,
        LENT
  FROM TEST
  WHERE BR<>0;
  CURSOR C_LENT IS
  SELECT KEY,
       BR,
       LENT
  FROM TEST
  WHERE LENT<>0;

begin
  -- Test statements here
  FOR X IN C_BR LOOP
      FOR Y IN C_LENT LOOP
      IF X.BR = Y.LENT THEN
         DBMS_OUTPUT.PUT_LINE(X.KEY||'-'||X.BR||'-'||X.LENT);
         DBMS_OUTPUT.PUT_LINE(Y.KEY||'-'||Y.BR||'-'||Y.LENT);
         EXIT ;
      END IF ;
      END LOOP;
  END LOOP ;  
END;
结果
A001-10-0
A002-0-10
A003-10-0
A002-0-10
A006-20-0
A007-0-20
A008-20-0
A007-0-20
A009-30-0
A010-0-30
A013-58-0
A016-0-58
A017-51-0
A014-0-51;
可是并不对。我想请教楼主PL/SQL怎么做呢?

使用道具 举报

回复
论坛徽章:
0
13#
发表于 2005-1-19 15:56 | 只看该作者
如果用PL/SQL应该如何做呢???????????

使用道具 举报

回复
论坛徽章:
0
14#
发表于 2005-1-20 09:13 | 只看该作者
我想到了一个用PL/SQL的方法.嘻嘻 不知道大家还有什么好的办法呢?
表 TEST
           KEY        BR        LENT
1        A001        10        0
2        A002        0        10
3        A003        10        0
4        A004        0        10
5        A005        0        10
6        A006        20        0
7        A007        0        20
8        A008        20        0
9        A009        30        0
10        A010        0        30
11        A011        40        0
12        A012        0        50
13        A013        58        0
14        A014        0        51
15        A015        21        0
16        A016        0        58
17        A017        51        0
18        A011        25        0
19        A012        0        25
20        A013        28        0
21        A014        0        28
22        A015        25        0
23        A016        0        28
PL/SQL 语句:
  declare
  -- Local variables here
  i integer;
  M NUMBER ;
  N NUMBER ;
  J NUMBER ;
  CURSOR C_TEST IS
  SELECT DISTINCT A.BR BR
  FROM  TEST A,
        TEST B
  WHERE A.BR=B.LENT
  AND   A.BR <>0;
begin
  -- Test statements here
  FOR X IN C_TEST LOOP
      SELECT COUNT(C.BR)
      INTO  M
      FROM  TEST C
      WHERE C.BR = X.BR;
      SELECT COUNT(D.LENT)
      INTO  N
      FROM  TEST D
      WHERE D.LENT = X.BR;
      IF M >= N THEN
      J := N;
      ELSIF N >=M THEN  
      J :=M;
      END IF ;
      FOR T IN (SELECT KEY , BR,LENT FROM TEST  WHERE BR = X.BR AND ROWNUM <= J) LOOP
            DBMS_OUTPUT.PUT_LINE(T.KEY||'-'||T.BR||'-'||T.LENT);
      END LOOP;
      FOR U IN (SELECT KEY , BR,LENT FROM TEST  WHERE LENT = X.BR AND ROWNUM <= J) LOOP
            DBMS_OUTPUT.PUT_LINE(U.KEY||'-'||U.BR||'-'||U.LENT);
      END LOOP;
  END LOOP;
结果:
A001-10-0
A003-10-0
A002-0-10
A004-0-10
A006-20-0
A007-0-20
A011-25-0
A012-0-25
A013-28-0
A014-0-28
A009-30-0
A010-0-30
A017-51-0
A014-0-51
A013-58-0
A016-0-58

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
15#
发表于 2005-1-20 15:30 | 只看该作者
关注

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-03-12 06:00:13
16#
发表于 2005-1-21 13:56 | 只看该作者
最初由 haicom 发布
[B]如果用PL/SQL应该如何做呢??????????? [/B]


用pl/sql
create or replace procedure merry
as
cursor a1 is select  distinct key_in from k_test where key_in <>0;
num1 int;
num2 int;
a1a k_test.key_in%type;
type ccc is ref cursor;
k01 ccc;
rowvalues k_test%rowtype;
begin
for a1a in a1 loop

select count(*) into num1 from k_test where key_in =a1a.key_in;
select count(*) into num2 from k_test where key_out=a1a.key_in;
  if num2 is null then
  
    null;
  
  else
  
   if num1<num2 then
   
    open k01 for select * from k_test where key_in=a1a.key_in;
      loop
      fetch k01 into rowvalues;
      exit when k01%notfound;
      insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
      end loop;
    close k01;
   
    open k01 for select key,key_in,key_out from (select * from (select key,key_in,key_out, row_number() over (partition by key_out order by key_out) tt from k_test) where tt<=num1) where key_out=a1a.key_in;
    loop
      fetch k01 into rowvalues;
      exit when k01%notfound;
      insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
      end loop;
    close k01;
   
    else
     
     open k01 for  select * from k_test where key_out = a1a.key_in;
     loop
      fetch k01 into rowvalues;
      exit when k01%notfound;
      insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
      end loop;
     close k01;
     
     open k01 for select key,key_in,key_out from (select * from (select key,key_in,key_out, row_number() over (partition by key_in order by key_in) tt from k_test) where tt<=num2) where key_in=a1a.key_in;
     loop
      fetch k01 into rowvalues;
      exit when k01%notfound;
      insert into k_test1 values (rowvalues.key,rowvalues.key_in,rowvalues.key_out);
      end loop;
     close k01;
   
   end if;
  end if;
end loop;
end;

就是麻烦了点

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表