两表连接的问题,请求帮助

[复制链接]
查看11 | 回复9 | 2008-2-13 12:43:03 | 显示全部楼层 |阅读模式
有人说问题描述不清楚,其实就是要求A表的所有记录在B表都有唯一一条与之对应。
A表本身可能存在两条或多条一样的的记录,这时也要求B表中有同样数目的记录与A表一一对应。

有表A
c1c2
-----------
a1AA
a1BB

有表B
c1c2
-----------
a1AAA
a1BBB

正常的通过a1字段连接命令结果是:
a1AAAAA
a1AABBB
a1BBAAA
a1BBBBB
请问有没有办法做到某一条记录一旦连接后,不再参与连接:
a1AAAAA
a1BBBBB
或者
a1AABBB
a1BBAAA

有没有办法不写程序,直接用ORACLE语句来解决?
[ 本帖最后由 米弗 于 2008-6-25 16:50 编辑 ]
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
加上rownum伪列做连接条件即可
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 jvkojvko 于 2008-6-25 16:09 发表
加上rownum伪列做连接条件即可



严谨些用ROW_NUMBER


回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 jvkojvko 于 2008-6-25 16:09 发表
加上rownum伪列做连接条件即可


真实的表不会只两条,也不是两表正好对应。
[ 本帖最后由 米弗 于 2008-6-25 16:35 编辑 ]
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
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 编辑 ]
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 米弗 于 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 编辑 ]
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
这样吧,你先写出你的原始语句,然后大家在此基础上修改,达到你的目的,OK?
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 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 编辑 ]
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
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;
回复

使用道具 举报

千问 | 2008-2-13 12:43:03 | 显示全部楼层
原帖由 米弗 于 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

ca1ca2rn1
-----------
a1AA 1
a1BB2

表T2

cb1cb2rn2
-----------
a1AAA1
a1BBB 2

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

我的上面语句的结果应是:
a1AAAAA
a1BBBBB
如果将其中的一个ORDER BY ...DESC
则结果是:
a1BBAAA
a1BBBBB


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

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行