【发布时间】: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.COLK、X.COLP、B.COLX、B.COLW
最终目标是,如果满足以下条件:
- 如果表 A 中有多个记录,其中
A.COL1和A.COL3匹配(并且表 X 中有相应记录) - 其中一行不为空,例如
A.COL4 = B,还有一个为NULL
我更新表 X 以将 MERGE 语句中的 X.COLK、X.COLP(K1 和 777)替换为表 B 中的值(B.COLX、B.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中的COLK和COLP的值才能匹配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