一个SQL100分

wantsong 2004-11-18 10:10:46
有两个表TB1和TB2
TB1字段为A,B:
A B
A1 B1
A1 B2
A2 B1
A2 B2
A3 B3
... ...
TB2字段为A,C:
A C
A1 C1
A1 C2
A1 C3
A2 C1
A2 C2
... ...

要求最后查出来的效果:
A B C
A1 B1 C1
A1 B2 C2
A1 "" C3
A2 B1 C1
A2 B2 C2
A2 B3 ""
... ... ...

即两个表按A关联,若B或C字段无数据则补""
请教大家怎么写这个SQL?
...全文
213 点赞 收藏 34
写回复
34 条回复
kulama2004 2004年11月18日
他要的结果不存在关系代数之间关系,和和
回复 点赞
ORARichard 2004年11月18日
楼主根本不是要关联。

比如,tb1中有n个a1,tb2中有m个a1,则返回的结果中要有max(n,m)个a1
回复 点赞
wantsong 2004年11月18日
test_1
a b
A1 Ba
A1 Bb
A1 Bc
A2 Ba
A2 Bb
A4 Ba

test
ca cb
A1 B1
A1 B2
A2 B1
A2 B2
A3 B1

Result:
ca cb b
A1 B1 Ba
A1 B2 Bb
A1 "" Bc
A2 B1 Ba
A2 B2 Bb
A3 B1 ""
A4 "" Ba
回复 点赞
kulama2004 2004年11月18日
what's the result that you wanna to get?
The key problem is that we can not understand your requirement and your business logic...
回复 点赞
wantsong 2004年11月18日
问题不在于decode(b,null,'""',b),不是取不到值,而是如何避免Cartesian Product
回复 点赞
ORARichard 2004年11月18日
我知道你的意思了,但你的要求绝对不是用ca和a 做关联
回复 点赞
wantsong 2004年11月18日
test_1
a b
A1 Ba
A1 Bb
A1 Bc
A2 Ba
A2 Bb

test
ca cb
A1 B1
A1 B2
A2 B1
A2 B2
A3 B1

执行sql:
SELECT distinct CA,
DECODE(CB,NULL,'""',CB) as cb,
DECODE(B,NULL,'""',B) as b
FROM TEST,TEST_1
WHERE CA = A(+)

结果
ca cb b
A1 B1 Ba
A1 B1 Bb
A1 B1 Bc
A1 B2 Ba
A1 B2 Bb
A1 B2 Bc
A2 B1 Ba
A2 B1 Bb
A2 B2 Ba
A2 B2 Bb
A3 B1 ""

还是不对。呵呵,这不象想的那样简单。
回复 点赞
kulama2004 2004年11月18日
SELECT DISTINCT CA,
DECODE(CB,NULL,'""',CB),
DECODE(B,NULL,'""',B)
FROM TEST,TEST_1
WHERE CA(+) = A(+)

Is it that ok? I have not given a whirl as my oracle server is down...
回复 点赞
ORARichard 2004年11月18日
那是因为你的原始数据中有重复的啊

改为

select distinct tb1.a,decode(tb1.b,null,'',tb1.b),decode(tb2.c,null,'',tb2.c) from tb1,tb2 where tb1.a=tb2.a(+)
回复 点赞
wantsong 2004年11月18日
:)
union 是纵向的合并,现在我需要的是按某规则横向的合并。
回复 点赞
kulama2004 2004年11月18日
加DISTINCT
回复 点赞
kulama2004 2004年11月18日
我没明白你的连接需求,但是按照你写出来的result例子来看..不是右连的结果
而是全外连接或是Cartesian Product的结果的说...
函数可以用NVL或者DECODE
回复 点赞
wantsong 2004年11月18日
A1 应该出现3次
A2 应该出现4次
只有A3正确,因为右连接未关联上
回复 点赞
wantsong 2004年11月18日
测试结果:
test 表
ca cb
A1 B1
A1 B2
A1 B1
A2 B1
A2 B2
A2 B2
A2 B2
A3 B1

test_1表
a b
A1 B
A1 B
A1 B
A2 B
A2 B

执行sql:
SELECT CA,
DECODE(CB,NULL,'""',CB),
DECODE(B,NULL,'""',B)
FROM TEST,TEST_1
WHERE CA = A(+)
执行结果:
ca compute_0002 compute_0003
A1 B1 B
A1 B1 B
A1 B1 B
A1 B2 B
A1 B2 B
A1 B2 B
A1 B1 B
A1 B1 B
A1 B1 B
A2 B1 B
A2 B1 B
A2 B2 B
A2 B2 B
A2 B2 B
A2 B2 B
A2 B2 B
A2 B2 B
A3 B1 ""

结果是错误的。
回复 点赞
ORARichard 2004年11月18日
try:

select tb1.a,decode(tb1.b,null,'',tb1.b),decode(tb2.c,null,'',tb2.c) from tb1,tb2 where tb1.a=tb2.a(+)
回复 点赞
ORARichard 2004年11月18日
bluelamb(bluelamb)的好象是内连接啊
回复 点赞
ORARichard 2004年11月18日
如果是取右连接,那应该能用的,你自己可以调试一下吗
回复 点赞
wantsong 2004年11月18日
sorry,打开的比较早,回的是 bluelamb(bluelamb) 那段。
回复 点赞
wantsong 2004年11月18日
忘了说明,要求最后查出来的效果:
A B C
A1 B1 C1
A1 B2 C2
A1 "" C3
A2 B1 C1
A2 B2 C2
A2 B3 ""
A3 B3 ""
... ... ...
所以右连接是必须的,但是楼上写的SQL做过测试么?
回复 点赞
kulama2004 2004年11月18日
nvl 或者decode

select TB1.A, NVL(TB1.B,'""'), NVL(TB1.B,'""') from ....
回复 点赞
发动态
发帖子
基础和管理
创建于2007-09-28

7175

社区成员

9.5w+

社区内容

Oracle 基础和管理
社区公告
暂无公告