在 MERGE 中交叉应用

Posted

技术标签:

【中文标题】在 MERGE 中交叉应用【英文标题】:CROSS APPLY in MERGE 【发布时间】:2020-08-21 12:12:27 【问题描述】:

有一个表需要更正多列中的值。然后是一个包含所有需要更正的值的表。

有没有一种简单的方法如何在 MERGE 语句中使用 CROSS APPLY?

根据我目前的知识,我需要为 column1、column2 等运行以下代码。

MERGE INTO target_table AS t
USING source_table AS s
ON t.key_column = s.key_column
    AND 'column_1' = s.correction_column
WHEN MATCHED THEN  
UPDATE SET t.column_1 = s.correction_value;

编辑: 这些是目标、源和预期结果的玩具示例。

目标:

##    |  uid | col_1 | col_2 | col_3 | col_4 | col_5
----------------------------------------------------
## 1  |    1 |     a |     a |     a |     a |     a
## 2  |    2 |     a |     a |     a |     a |     a
## 3  |    3 |     a |     a |     a |     a |     a
## 4  |    4 |     a |     a |     a |     a |     a
## 5  |    5 |     a |     a |     a |     a |     a
## 6  |    6 |     a |     a |     a |     a |     a

来源:

##    |  uid |   col | value
----------------------------
## 1  |    1 | col_1 |     B
## 2  |    1 | col_2 |     C
## 3  |    4 | col_3 |     D
## 4  |    4 | col_4 |     E
## 5  |    5 | col_3 |     F

预期结果:

##    |  uid | col_1 | col_2 | col_3 | col_4 | col_5
----------------------------------------------------
## 1  |    1 |     B |     C |     a |     a |     a
## 2  |    2 |     a |     a |     a |     a |     a
## 3  |    3 |     a |     a |     a |     a |     a
## 4  |    4 |     a |     a |     D |     E |     a
## 5  |    5 |     a |     a |     F |     a |     a
## 6  |    6 |     a |     a |     a |     a |     a

【问题讨论】:

您希望将CROSS APPLY 准确地放在哪里? CROSS APPLYing 你也是什么表值函数?帮助我们帮助您。样本数据和预期结果也会对此有所帮助。 我同意@Larnu,我们需要更多信息才能在这里提供帮助。附带说明一下,当使用MERGE 语句时,我的目标表仅作为表列出,而我的源表通常是一个查询。如果它是一个复杂的查询(或者您需要过滤分区/窗口字段),那么您可以使用CTE 引导到MERGE 语句。 我已添加示例数据和预期结果。我没有任何表值函数。也许我对 CROSS APPLY 的看法是错误的,但我认为它是解决我问题的功能。 【参考方案1】:

您可以将查询放在括号中以创建派生表

例子

MERGE INTO target_table AS t
USING (select * from source_table a cross apply (select top 1 * from other_table b where b.id = a.id order by some_date desc) b2) AS s
ON t.key_column = s.key_column
    AND 'column_1' = s.correction_column
WHEN MATCHED THEN  
UPDATE SET t.column_1 = s.correction_value;

【讨论】:

other_table 是什么?我认为这并不能解决通过 target_table 的所有列应用 MERGE 的问题。也许我的编辑有助于理解问题。

以上是关于在 MERGE 中交叉应用的主要内容,如果未能解决你的问题,请参考以下文章

R中merge

在 Python 中合并交叉表

熊猫交叉加入没有共同的列[重复]

归并排序中为啥要在阈值交叉后使用插入排序

php交叉合并数组

在sql server中交叉应用