当前位置: 代码迷 >> Oracle管理 >> 二个表的联合查询
  详细解决方案

二个表的联合查询

热度:45   发布时间:2016-04-24 05:02:14.0
2个表的联合查询
表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出来

------解决方案--------------------
结果中的
2 测试1-0001 aa-0002
怎么来的表示很疑惑。。。 

------解决方案--------------------
SQL code
--不确定是不是理解你的意思了select A.id, B.bh, B.bbh from A,B where instr(B.bh, A.bh)>0;
------解决方案--------------------
此奥,我问你:
测试1-0001 在B表里存在两条,我勒个去的,你根据什么规则确定两条数据都要显示的?
需求混乱的要命。。
------解决方案--------------------
SQL code
select id,bh,bbh from Bunion allselect id,bh,null from A,Bwhere instr(B.bh, A.bh) = 0;
------解决方案--------------------
SQL code
select id,bh,bbh from Bunion allselect A.id,A.bh,null from A,B --这个就是查询A表的同学 上面忘记写表别名了。where instr(B.bh, A.bh) = 0;
------解决方案--------------------
SQL code
--这不给你把剩下的 不在B里的(instr(B.bh, A.bh) = 0)给你union 上了么。。。。union allselect A.id,A.bh,null from A,B where instr(B.bh, A.bh) = 0;
------解决方案--------------------
SQL code
WITH a AS(SELECT '1' ID ,'测试1-0001' bh,'测试1' NAME, '2012-01-01' rq FROM dualUNION ALLSELECT '2' ID ,'测试1-0002' bh,'测试1' NAME, '2012-01-01' rq FROM dualUNION 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,bWHERE a.bh LIKE '%'||b.bh(+)||'%'
------解决方案--------------------
SQL code
[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-00012 测试1-0001                         aa-00023 测试1-0002、测试1-0003             aa-00034 测试1-0001、测试1-0002、测试2-0002 aa-00054 测试2-00016 测试2-0003已选择6行。[SYS@myoracle] SQL>
  相关解决方案