我需要将数据从一个表插入到另一个表中,但是这个插入必须查看接收数据的表以确定是否匹配,如果是,则不要插入新数据。< / 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)
全部
答案 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}}