在oracle中合并语句帮助

时间:2014-10-23 11:03:34

标签: sql oracle merge oracle11g

我正在使用合并第一次...虽然但是没有得到适当的帮助但仍然没有得到适当的帮助。

请帮我解决以下问题,

我有一个表“table_a”有3列AB和C,C是新列,添加的列A和B的组合是唯一的,具体的列B是从table_b取得的子代码列表,并针对A栏中的实体。

我需要使用现有A和B组合的硬编码值更新C列,如果table_A中table_b中缺少某些子代码,则需要在table_a中插入相同的行。

例如。 table_a

A    B   C                              
=    =   =
p    x
p    y

表b

M
=
x
y
z

执行查询后

表-A

A    B   C                              
=    =   =
p    x   1   -- updated with column C
p    y   1   -- updated with column C
p    z   1   -- new row inserted for the row in table B

如果有任何事情不清楚,请告诉我。

提前感谢。

2 个答案:

答案 0 :(得分:1)

MERGE INTO table_A a
   USING table_b b
      ON(a.b = b.m)
   WHEN MATCHED THEN 
      UPDATE SET a.c = 1
   WHEN NOT MATCHED THEN 
      INSERT (a, b, c)
      VALUES ('P', b.m, 1)

注意:插入内容有两个硬编码值,列a和列c为' P'和1分别。

答案 1 :(得分:0)

如果您不想对插入的值进行硬编码,则可以使用内嵌视图生成所有预期的组合并合并。

merge into table_a a
using (
  select t.a, b.m, 1 as c
  from (select distinct a from table_a) t
  cross join table_b b
) b
on (a.b = b.m)
when matched then
  update set a.c = b.c
when not matched then
  insert (a, b, c) values (b.a, b.m, b.c);

using子句对所有table_a.a值进行所有(不同)table_b.m值的交叉连接,以提供所有可能的组合。 (这似乎是你想要的;你还没有显示两者之间的任何其他联系)。我还在该视图中包含了固定值1

然后,合并会为c中已经退出的匹配值设置table_a,或者使用内嵌视图中的值插入新行。

SQL Fiddle

您可以从其他查找表中获取唯一的a值,这比点击table_a两次更好,但这取决于您的实际数据模型。