如果与表值匹配,则将数据包含在查找每个插入的表中

时间:2017-02-09 13:55:35

标签: sql oracle

我需要将数据从一个表插入到另一个表中,但是这个插入必须查看接收数据的表以确定是否匹配,如果是,则不要插入新数据。< / p>

所以,我有下一个表(NODE_ID指的是NODE1和NODE2中的值,考虑每个人都有两个节点的行)

Table A:
| ARC | NODE1 | NODE2 | STATE |
| x   |  1    |  2    |   A   |
| y   |  2    |  3    |   A   |
| z   |  3    |  4    |   B   |

Table B:
| NODE_ID| VALUE |
|    1   |   N   |
|    2   |   N   |
|    3   |   N   |
|    4   |   N   |

想要下一个结果,它将NODE_ID与ARCS相关联,并在结果表中写入ARCS表中的STATE值,每个NODE只有一个结果,因为如果没有,我会有更多相同NODE的一行:

Table C result:
| NODE_ID| STATE |
|    1   |   A   |
|    2   |   A   |
|    3   |A(or B)|

我尝试使用带有EXISTS,IF和NVL2()的CASE语句在select中执行此操作,但此时没有结果。

关于如何编写此查询的任何想法?

非常感谢您的帮助

好的,我编辑我的信息来解释我最后是如何做到的,我还改变了一点点我的第一条信息,使其更加清晰,因为我们遇到了问题。

所以最后我使用了这个查询,@ mathguy介绍给我:

merge into Table_C c
   using (select distinct b.NODE_ID as nodes, a.STATE
          from Table_A a, Table_B b
          where (b.NODE_ID=a.NODE1 or b.NODE_ID=a.NODE2) s
   on (s.nodes=c.NODE_ID)

when not matched then
  insert (NODE_ID, STATE)
  values (s.nodes, s.STATE)

全部

2 个答案:

答案 0 :(得分:4)

这可以使用insert完成,但通常当您使用另一个表更新一个表时,merge语句更强大(更灵活)。

merge into table_c c
  using ( select arc, min(state) as state from table_a group by arc ) s
  on (s.arc = c.node_id)
when not matched then insert (node_id, state)
  values (s.arc, s.state)
;

感谢@Boneist和@ThorstenKettner指出了几个语法错误(现已修复)。

答案 1 :(得分:0)

如果表C尚不存在,请使用create select语句:

create table c as select arc as node_id, min(state) as state from a group by arc;

如果可能存在重复弧(您的样本中未显示),则需要聚合:

{{1}}