【问题标题】:Merge statement help in oracleoracle中的合并语句帮助
【发布时间】:2014-12-19 00:55:27
【问题描述】:

我第一次使用合并...我解决了现有问题,但无法获得适当的帮助。

请帮我解决以下需求,

我有一个表“table_a”,其中包含 3 列 A、B 和 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

table_b

M
=
x
y
z

查询执行后

table_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

如果有什么不清楚的地方请告诉我。

【问题讨论】:

    标签: sql oracle merge oracle11g


    【解决方案1】:

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

    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 更好,但这取决于您的真实数据模型。

    【讨论】:

    • 谢谢亚历克斯,实际上我的情况不需要列 a 的硬编码,但 table_b 的选择因 table_a.a 中配置的值而异...我可以举个例子,如果 table_a 是 cvolumn a被配置为'FRUITS'然后table_b是table_a的b列中的一些table_fruits我将配置table_fruits中存在的所有值.....在第二种情况下说table_a.a ='automobile'然后我将使用其他一些表说 table_automobile,我需要将 table_automobile 的所有行配置到 table_a.b 列中,table_a.a='automobile'。不确定我是否可以在这里使用批量和大小写来实现它
    • @PavanKumar - 这真的超出了这个问题的范围。您应该就此提出一个新问题,最好使用更完整的数据样本和问题描述。但首先你可以看看你是否能找到一种方法来获取最终结果集作为查询 - 然后将成为using 子查询。
    • 现在我已经为 table_a.a 的不同值提供了多个语句。肯定会根据您的建议尝试单个查询。再次感谢您的帮助..
    【解决方案2】:
    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。

    【讨论】:

    • 不会运行 - a.a 不存在
    • 正确,与表别名和列名混淆。需要硬编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多