一个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?
...全文
248 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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 ....
加载更多回复(14)

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧