ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle开发 » 两表连接的问题,请求帮助

标题: 两表连接的问题,请求帮助
离线 米弗


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

发表于 2008-6-25 15:57 
两表连接的问题,请求帮助

有人说问题描述不清楚,其实就是要求A表的所有记录在B表都有唯一一条与之对应。
A表本身可能存在两条或多条一样的的记录,这时也要求B表中有同样数目的记录与A表一一对应。



有表A

c1  c2
-----------
a1  AA
a1  BB


有表B

c1  c2
-----------
a1  AAA
a1  BBB


正常的通过a1字段连接命令结果是:

a1  AA  AAA
a1  AA  BBB
a1  BB  AAA
a1  BB  BBB

请问有没有办法做到某一条记录一旦连接后,不再参与连接:

a1  AA  AAA
a1  BB  BBB

或者

a1  AA  BBB
a1  BB  AAA


有没有办法不写程序,直接用ORACLE语句来解决?

[ 本帖最后由 米弗 于 2008-6-25 16:50 编辑 ]


只看该作者    顶部
在线/呼叫 jvkojvko
小马哥


精华贴数 1
个人空间 0
技术积分 5603 (235)
社区积分 44740 (17)
注册日期 2007-9-10
论坛徽章:18
祖母绿萤石祖母绿紫水晶紫水晶红宝石
海蓝宝石紫水晶蓝锆石月度论坛发贴之星金色在线徽章 

发表于 2008-6-25 16:09 
加上rownum伪列做连接条件即可


__________________
马无夜草不肥,人无外财不富。

-------------------------------
长期高价出售奥运章
只看该作者    顶部
离线 visual2006



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

发表于 2008-6-25 16:16 


QUOTE:
原帖由 jvkojvko 于 2008-6-25 16:09 发表
加上rownum伪列做连接条件即可

严谨些用ROW_NUMBER


只看该作者    顶部
离线 米弗


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

发表于 2008-6-25 16:27 


QUOTE:
原帖由 jvkojvko 于 2008-6-25 16:09 发表
加上rownum伪列做连接条件即可

真实的表不会只两条,也不是两表正好对应。

[ 本帖最后由 米弗 于 2008-6-25 16:35 编辑 ]


只看该作者    顶部
离线 zhangfengh
老狐狸


精华贴数 3
个人空间 0
技术积分 13046 (87)
社区积分 5825 (260)
注册日期 2002-10-12
论坛徽章:89
现任管理团队成员2008北京奥运纪念徽章:自行车    
      

发表于 2008-6-25 16:30 
没明白楼主的意思


__________________
=======================================
狐狸在这个世界上是凭借聪明而得到生存的,并且在这个世界上占有一席之地,学习狐狸的聪明,少走弯路。
=======================================
吸收别人的经验,使之成为自己的经验!
=======================================
只看该作者    顶部
离线 caizhuoyi
Oracle Stranger


精华贴数 2
个人空间 0
技术积分 1524 (1104)
社区积分 448 (1497)
注册日期 2006-3-1
论坛徽章:4
授权会员生肖徽章2007版:龙2008北京奥运纪念徽章:棒球数据库板块每日发贴之星  
      

发表于 2008-6-25 16:43 
也就是a中记录与b中分组的第一条记录连接:

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
),
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
)
SELECT a.col1, a.col2, b.col2
  FROM a,
       (SELECT b.*, row_number() over(PARTITION BY col1 ORDER BY NULL) rn
          FROM b) b
WHERE a.col1 = b.col1
   AND b.rn = 1;

[ 本帖最后由 caizhuoyi 于 2008-6-25 16:45 编辑 ]


__________________
我不在江湖,但江湖中有我的传说;
我身在江湖,江湖里却没有我的传说。
只看该作者    顶部
在线/呼叫 zhangweicai74
阿财


来自 贵州
精华贴数 3
个人空间 240
技术积分 5716 (231)
社区积分 21786 (58)
注册日期 2007-12-13
论坛徽章:156
授权会员生肖徽章2007版:狗生肖徽章2007版:虎生肖徽章2007版:龙  
      

发表于 2008-6-25 16:44 


QUOTE:
原帖由 米弗 于 2008-6-25 16:27 发表



真实的表不会只两条,也不是两表正好对应。

是不是这个意思?
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
猜的呵,楼主看下是不是你想要的,语句没测试过.

[ 本帖最后由 zhangweicai74 于 2008-6-25 16:56 编辑 ]


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

美丽家乡黄果树瀑布
http://space.itpub.net/12391917/viewspace-244134
只看该作者    顶部
在线/呼叫 zhangweicai74
阿财


来自 贵州
精华贴数 3
个人空间 240
技术积分 5716 (231)
社区积分 21786 (58)
注册日期 2007-12-13
论坛徽章:156
授权会员生肖徽章2007版:狗生肖徽章2007版:虎生肖徽章2007版:龙  
      

发表于 2008-6-25 16:52 
这样吧,你先写出你的原始语句,然后大家在此基础上修改,达到你的目的,OK?


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

美丽家乡黄果树瀑布
http://space.itpub.net/12391917/viewspace-244134
只看该作者    顶部
离线 zhangfengh
老狐狸


精华贴数 3
个人空间 0
技术积分 13046 (87)
社区积分 5825 (260)
注册日期 2002-10-12
论坛徽章:89
现任管理团队成员2008北京奥运纪念徽章:自行车    
      

发表于 2008-6-25 16:58 


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
猜的呵,楼主看下是不是你想要的,语句没测试过.

这个思路是对的,lz参考一下就是了


__________________
=======================================
狐狸在这个世界上是凭借聪明而得到生存的,并且在这个世界上占有一席之地,学习狐狸的聪明,少走弯路。
=======================================
吸收别人的经验,使之成为自己的经验!
=======================================
只看该作者    顶部
离线 米弗


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

发表于 2008-6-25 17:02 


QUOTE:
原帖由 zhangweicai74 于 2008-6-25 16:52 发表
这样吧,你先写出你的原始语句,然后大家在此基础上修改,达到你的目的,OK?

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

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

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

[ 本帖最后由 米弗 于 2008-6-25 17:04 编辑 ]


只看该作者    顶部
相关内容


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