2个表的联合查询

zzxiaoma 2012-10-10 11:13:54
表A
id bh name rq
1 测试1-0001 测试1 2012-01-01
2 测试1-0002 测试1 2012-01-01
3 测试1-0003 测试1 2012-01-01
4 测试2-0001 测试2 2012-01-01
5 测试2-0002 测试2 2012-01-01
6 测试2-0003 测试2 2012-01-01

表B
id bbh bh rq
1 aa-0001 测试1-0001、测试2-0002 2012-01-01
2 aa-0002 测试1-0001 2012-01-01
3 aa-0003 测试1-0002、测试1-0003 2012-01-01
4 aa-0005 测试1-0001、测试1-0002、测试2-0002 2012-01-01

表B的bh是从表A的bh中取得的,现在想把2个表联合查询获得,如果bh已经存在于表B中,就已表B中的bh来显示,如果表B中bh没有表A中的编号,表A的bh还要显示出来
id bh bbh
1 测试1-0001、测试2-0002 aa-0001
2 测试1-0001 aa-0002
3 测试1-0002、测试1-0003 aa-0003
4 测试1-0001、测试1-0002、测试2-0002 aa-0005
5 测试2-0001
6 测试2-0003
最好能一条sql出来
...全文
237 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenChiM888 2012-10-11
  • 打赏
  • 举报
回复

[SYS@myoracle] SQL>WITH a AS
2 (SELECT '1' ID ,'测试1-0001' bh,'测试1' NAME, '2012-01-01' rq FROM dual
3 UNION ALL
4 SELECT '2' ID ,'测试1-0002' bh,'测试1' NAME, '2012-01-01' rq FROM dual
5 UNION ALL
6 SELECT '3' ID ,'测试1-0003' bh,'测试1' NAME, '2012-01-01' rq FROM dual
7 UNION ALL
8 SELECT '4' ID ,'测试2-0001' bh,'测试2' NAME, '2012-01-01' rq FROM dual
9 UNION ALL
10 SELECT '5' ID ,'测试2-0002' bh,'测试2' NAME, '2012-01-01' rq FROM dual
11 UNION ALL
12 SELECT '6' ID ,'测试2-0003' bh,'测试2' NAME, '2012-01-01' rq FROM dual
13 ),
14 b AS
15 (
16 SELECT '1' ID ,'aa-0001' bbh,'测试1-0001、测试2-0002' bh, '2012-01-01' rq FROM dual
17 UNION ALL
18 SELECT '2' ID ,'aa-0002' bbh,'测试1-0001' bh, '2012-01-01' rq FROM dual
19 UNION ALL
20 SELECT '3' ID ,'aa-0003' bbh,'测试1-0002、测试1-0003' bh, '2012-01-01' rq FROM dual
21 UNION ALL
22 SELECT '4' ID ,'aa-0005' bbh,'测试1-0001、测试1-0002、测试2-0002' bh, '2012-01-01' rq FROM dual
23 )
24 SELECT ID, BH, BBH
25 FROM B
26 UNION ALL
27 SELECT ID, BH, NULL
28 FROM A
29 WHERE A.ID NOT IN (SELECT A.ID FROM A, B WHERE INSTR(B.BH, A.BH) > 0);

I BH BBH
- ---------------------------------- -------
1 测试1-0001、测试2-0002 aa-0001
2 测试1-0001 aa-0002
3 测试1-0002、测试1-0003 aa-0003
4 测试1-0001、测试1-0002、测试2-0002 aa-0005
4 测试2-0001
6 测试2-0003

已选择6行。

[SYS@myoracle] SQL>
  • 打赏
  • 举报
回复
是没说清楚 还是结果写少了? 表示功力不深看不懂
fw0124 2012-10-10
  • 打赏
  • 举报
回复
--不确定是不是理解你的意思了
select A.id, B.bh, B.bbh from A,B where instr(B.bh, A.bh)>0;
BenChiM888 2012-10-10
  • 打赏
  • 举报
回复
结果中的
2 测试1-0001 aa-0002
怎么来的表示很疑惑。。。
BenChiM888 2012-10-10
  • 打赏
  • 举报
回复
神一样的需求,没看懂。。。。
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
楼上的结果不对啊
tobarman 2012-10-10
  • 打赏
  • 举报
回复

WITH a AS
(SELECT '1' ID ,'测试1-0001' bh,'测试1' NAME, '2012-01-01' rq FROM dual
UNION ALL
SELECT '2' ID ,'测试1-0002' bh,'测试1' NAME, '2012-01-01' rq FROM dual
UNION ALL
SELECT '3' ID ,'测试1-0003' bh,'测试1' NAME, '2012-01-01' rq FROM dual
),
b AS
(
SELECT '1' ID ,'aa-0001' bbh,'测试1-0001、测试2-0002' bh, '2012-01-01' rq FROM dual
UNION ALL
SELECT '2' ID ,'aa-0002' bbh,'测试1-0001' bh, '2012-01-01' rq FROM dual
)
SELECT * FROM a,b
WHERE a.bh LIKE '%'||b.bh(+)||'%'
Juedaifanghua 2012-10-10
  • 打赏
  • 举报
回复
Sorry 也没看懂
BenChiM888 2012-10-10
  • 打赏
  • 举报
回复

--这不给你把剩下的 不在B里的(instr(B.bh, A.bh) = 0)给你union 上了么。。。。

union all
select A.id,A.bh,null from A,B where instr(B.bh, A.bh) = 0;




[Quote=引用 14 楼 的回复:]
不是这个意思,比如要查表A的字段rrt,
select id,bh,bbh from B --这个地方就没有表A,肯定查不到了,如果加入表A的话from B,A 后面的条件怎么写?
union all
select A.id,A.bh,null from A,B where instr(B.bh, A.bh) = 0;
[/Quote]
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
不是这个意思,比如要查表A的字段rrt,
select id,bh,bbh from B --这个地方就没有表A,肯定查不到了,如果加入表A的话from B,A 后面的条件怎么写?
union all
select A.id,A.bh,null from A,B where instr(B.bh, A.bh) = 0;

BenChiM888 2012-10-10
  • 打赏
  • 举报
回复

select id,bh,bbh from B
union all
select A.id,A.bh,null from A,B --这个就是查询A表的同学 上面忘记写表别名了。
where instr(B.bh, A.bh) = 0;




[Quote=引用 11 楼 的回复:]
查询出来的结果需要表A里面的数据怎么办
[/Quote]
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
就是表A还有其他别的字段,结果里面也需要查询出来
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
查询出来的结果需要表A里面的数据怎么办
BenChiM888 2012-10-10
  • 打赏
  • 举报
回复

select id,bh,bbh from B
union all
select id,bh,null from A,B
where instr(B.bh, A.bh) = 0;


[Quote=引用 9 楼 的回复:]
只要表B的数据都原样显示,只有表A中bh不在表B的情况下,需要单独加一条记录,并且bbh为空
[/Quote]
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
只要表B的数据都原样显示,只有表A中bh不在表B的情况下,需要单独加一条记录,并且bbh为空
f0restwow 2012-10-10
  • 打赏
  • 举报
回复
楼主敢直接贴表结构么。。
BenChiM888 2012-10-10
  • 打赏
  • 举报
回复
此奥,我问你:
测试1-0001 在B表里存在两条,我勒个去的,你根据什么规则确定两条数据都要显示的?
需求混乱的要命。。
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
我晕,还是有点乱
总的来说表B存在的数据要显示出来,bh里面少了测试2-0001,测试2-0003
所以结果里面的bh还要出现
zzxiaoma 2012-10-10
  • 打赏
  • 举报
回复
排版乱了,精简一下
表A
bh

测试1-0001
测试1-0002
测试1-0003
测试2-0001
测试2-0002
测试2-0003

表B
bbh bh
aa-0001 测试1-0001、测试2-0002
aa-0002 测试1-0001
aa-0003 测试1-0002、测试1-0003
aa-0005 测试1-0001、测试1-0002、测试2-0002 2012-01-01

结果
bh bbh
测试1-0001、测试2-0002 aa-0001
测试1-0001 aa-0002
测试1-0002、测试1-0003 aa-0003
测试1-0001、测试1-0002、测试2-0002 aa-0005
测试2-0001
测试2-0003

17,382

社区成员

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

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