ITPUB??ì3
ITPUB论坛 » Oracle开发 » 两表连接的问题,请求帮助

标题: 两表连接的问题,请求帮助
离线 DragonBill
武陵愚生


精华贴数 1
个人空间 10
技术积分 3260 (443)
社区积分 391 (1582)
注册日期 2006-12-18
论坛徽章:13
2008北京奥运纪念徽章:击剑生肖徽章2007版:虎    
      

发表于 2008-6-25 18:12 
WITH a AS(
SELECT 'a1' col1,'AA' col2 FROM dual
UNION ALL
SELECT 'a1' col1,'BB' col2 FROM dual
UNION ALL
SELECT 'b1' col1,'AA' col2 FROM dual
UNION ALL
SELECT 'b1' col1,'BB' col2 FROM dual
UNION ALL
SELECT 'c1' col1,'BB' col2 FROM dual
UNION ALL
SELECT 'c1' col1,'AA' col2 FROM dual
UNION ALL
SELECT 'c1' col1,'BB' col2 FROM dual
),
b AS(
SELECT 'a1' col1,'AAA' col2 FROM dual
UNION ALL
SELECT 'a1' col1,'BBB' col2 FROM dual
UNION ALL
SELECT 'b1' col1,'AAA' col2 FROM dual
UNION ALL
SELECT 'b1' col1,'BBB' col2 FROM dual
UNION ALL
SELECT 'c1' col1,'BBB' col2 FROM dual
)
SELECT col1, col2, col3
FROM
(
   SELECT a.col1, a.col2, b.col2 col3,
          row_number() over(PARTITION BY a.col1 ORDER BY NULL) rn,
          COUNT(*) over(PARTITION BY a.col1) ct
    FROM a, b where a.col1 = b.col1
)
WHERE rn = ct;


只看该作者    顶部
离线 zhangweicai74
阿财


来自 贵州
精华贴数 3
个人空间 240
技术积分 5311 (242)
社区积分 20328 (66)
注册日期 2007-12-13
论坛徽章:135
2008北京奥运纪念徽章:跆拳道2008北京奥运纪念徽章:跆拳道2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:跆拳道2008北京奥运纪念徽章:跆拳道
2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击2008北京奥运纪念徽章:射击

发表于 2008-6-25 18:13 


QUOTE:
原帖由 米弗 于 2008-6-25 17:02 发表



我没写语句,正常应该是编程用两个游标来做。
我是想有没有简单的方法可以用SQL命令就搞定的。

要求是A表的每一条记录在B表上也有一条记录对应。
我想用A表与B表连接后,用连接出来的记录数去比原A表的记录数,如果记录数一致,那就证明A表与B表的记录是一一对应的。

这个问题主要就是A表有重复记录,所以B表上也有重复记录,一连接就成N*N了,无法判断A表上的记录与B表记录是否刚好一一对应。

不知你有没有按我的方法测试过?
ROW_NUMBER() OVER()后,与A表对应T1及与B表对应的T2如下:
表T1


ca1  ca2  rn1
-----------
a1  AA     1
a1  BB      2


表T2


cb1  cb2  rn2
-----------
a1  AAA    1
a1  BBB     2

你再按你的想法连接不行吗?

我的上面语句的结果应是:
a1  AA  AAA
a1  BB  BBB

如果将其中的一个ORDER BY ...DESC
则结果是:
a1  BB  AAA
a1  BB  BBB


[ 本帖最后由 zhangweicai74 于 2008-6-26 10:14 编辑 ]


__________________
NEVER TOO LATE
想吃贵州家乡菜不?进来嘛,老乡!!
http://space.itpub.net/12391917/viewspace-257185
玩玩双节棍(l_l)

美丽家乡黄果树瀑布
http://space.itpub.net/12391917/viewspace-244134
只看该作者    顶部
离线 阿日
2M-Never give up


精华贴数 0
个人空间 486
技术积分 1361 (1233)
社区积分 720 (1113)
注册日期 2004-1-4
论坛徽章:18
ITPUB元老红孩儿2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:棒球2008北京奥运纪念徽章:摔跤2008北京奥运纪念徽章:柔道
2008北京奥运纪念徽章:羽毛球2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:垒球2008北京奥运纪念徽章:皮划艇激流回旋每日论坛发贴之星 

发表于 2008-6-26 08:18 
按阿财的试试,应该没有问题吧


__________________
我欲将心向明月,奈何明月照沟渠.
阳光灿烂的日子,提高自身素质,努力向前 --自强不息 Don't give up!
相信-坚持-一定成功-多问-多看-多总结-多分析-加油
过去的都过去了,大不了从头再来,别回头,向前看!
http://blog.csdn.net/zxf_feng
只看该作者    顶部
离线 visual2006



精华贴数 0
个人空间 0
技术积分 768 (2435)
社区积分 4 (18235)
注册日期 2006-7-23
论坛徽章:1
      
      

发表于 2008-6-26 08:23 
啊日真早!


只看该作者    顶部
离线 米弗


精华贴数 0
个人空间 0
技术积分 60 (24142)
社区积分 0 (1676122)
注册日期 2008-1-10
论坛徽章:1
2008年新春纪念徽章     
      

发表于 2008-6-26 14:59 


QUOTE:
原帖由 zhangweicai74 于 2008-6-25 16:44 发表

是不是这个意思?
with t1 as (select a.*,row_number() over(partition by ca1 order by ca2) rn1 from a),
t2 as  (select b.*,row_number() over(partition by cb1 order by cb2) rn2 from b)
select t1.ca1,t1.ca2,t2.cb2 from t1,t2 where t1.ca1=t2.cb1 and t1.rn1=t2.rn2
猜的呵,楼主看下是不是你想要的,语句没测试过.

昨天晚饭的时候在电脑前看了半天你的回贴,忽然就想明白了
刚才才空闲下来,到机器上试了一试,果然。

在sqlplus命令行执行的是以下:
(不同是我找的表是找不同,所以加了最后一行的where语句)

with t1 as (select accnum,itemnu,invnam,invdat,invamt,
    row_number() over(partition by invnam,invdat,invamt order by invnam,invdat,invamt) rn
      from gsasklist where accnum='0000060809001  '),
  t2 as (select regnoo,itemnu,invnam,invdat,invamt,
    row_number() over(partition by invnam,invdat,invamt order by invnam,invdat,invamt) rn
      from gslist where regnoo='0000060809001  ')
  select t1.itemnu from t1 full join t2 on t1.accnum=t2.regnoo and t1.invnam=t2.invnam
    and t1.invdat=t2.invdat and t1.invamt=t2.invamt and t1.rn=t2.rn
      where t1.itemnu is null or t2.itemnu is null;

这个 over(partition by ... order by ...)  与 分析函数的组合果然是奇妙

谢谢楼上给予帮助的各位兄弟


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问