【问题标题】:How to Update the Following Table with MERGE in Oracle?如何在 Oracle 中使用 MERGE 更新下表?
【发布时间】:2019-03-30 13:00:47
【问题描述】:

我有以下数据集(Oracle 12):

Table X
+---------+--------+---------------+--------+
| COLN    | COLM   | COLK          | COLP   |
+---------+--------+---------------+--------+
| 1       | 500    | K1            | 777    |
+---------+--------+---------------+--------+

Table A
+---------+--------+---------------+--------+
| COL1    | COL2   | COL3          | COL4   |
+---------+--------+---------------+--------+
| 1       | K1     | 500           | B      |
| 1       | K2     | 500           | NULL   |
+---------+--------+---------------+--------+

Table B
+---------+--------+---------+
| COLZ    | COLX   | COLW    |
+---------+--------+---------+
| 1       | K1     | 777     |
| 1       | K2     | 678     |
+---------+--------+---------+

三张表有以下共同点:

X.COLN = A.COL1 = B.COLZ X.COLk = A.COL2 = B.COLX X.COLM = A.COL3

我需要编写一个查询,在一个查询中检索以下列的值:

X.COLKX.COLPB.COLXB.COLW

最终目标是,如果满足以下条件:

  • 如果表 A 中有多个记录,其中 A.COL1A.COL3 匹配(并且表 X 中有相应记录)
  • 其中一行不为空,例如A.COL4 = B,还有一个为NULL

我更新表 X 以将 MERGE 语句中的 X.COLKX.COLP(K1 和 777)替换为表 B 中的值(B.COLXB.COLW -- K2 和 678)。

这可能吗?

MERGE INTO X FX
USING (
    SELECT COLX ONGOING_X, COLW ONGOING_W 
    FROM B 
    WHERE (COLZ, COLX) IN 
        (SELECT COL1, COL2 
         FROM A 
         WHERE COL3 = ? 
            AND COL1 = ? 
            AND COL4 IS NULL)
) NEW_B
    ON (FX.COLk = ?
        AND FX.COLP = ?)
WHEN MATCHED THEN
    UPDATE SET
        FX.COLk = NEW_B.ONGOING_X,
        FX.FOLP = NEW_B.ONGOING_W;

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @KaushikNayak 根据我在原始帖子中更新的内容。但是我需要 NEW_B 中的 COLKCOLP 的值才能匹配 ON 子句,但是如何?
  • 那么,这是否意味着您只想更新 X 中具有 2 个匹配行的那些行(一个具有 col4 空,另一个具有 col4 不空),没有别的。如果他们有 3 行,其中 1 行为空,2 行不为空,该怎么办?
  • @KaushikNayak 这可能有 3 行,1 行为 NULL,2 行不为 NULL A.COL4。但是,第 3 行将没有匹配条件 X.COLK = A.COL2。我们将 X 中的一个特定行与 A 匹配(使用 COL1/COL2/COL3 = COLN/M/K)。然后使用 COL1 和 COL3,我将查找其COL4 为 NULL 的行(只有一个这样的记录可用)。但是,对于我的MERGE,不仅需要识别COL4 = NULL这样的行,以便在表B中找到对应的行,而且如果我想使用MERGE,我需要访问原始表 X 行。
  • 好的。我很难回忆。您能否检查并理解我的解决方案(并且可能会稍微修改它以处理这种情况)?语句的一般结构不需要改变,只有一些条件可以

标签: sql oracle merge sql-update oracle12c


【解决方案1】:

您可以使用ROWID 进行MERGE

MERGE INTO x tgt USING (
     WITH c AS (
          SELECT col1,
                 col3,
                 MAX(
                      CASE
                           WHEN col4 IS NULL THEN col2
                      END
                 ) AS col2 --Ongoing col2 as indicated from col4
          FROM a
          GROUP BY col1,
                   col3
          HAVING COUNT(
               CASE
                    WHEN col4 IS NULL THEN 1
               END
          ) = 1 AND COUNT(col4) = 1 --Contains one and exactly one NULL and one NON NULL
     ) SELECT x.rowid AS rid,
              b.*
       FROM x
       JOIN c ON c.col1 = x.coln AND c.col3 = x.colm 
       JOIN b ON b.colz = c.col1 AND b.colx = c.col2 --Join with ongoing value from c( a.k.a table A )
)
src ON ( tgt.rowid = src.rid ) --ROWID match
WHEN MATCHED THEN UPDATE SET tgt.colk = src.colx,
tgt.colp = src.colw;

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多