繁体   English   中英

通过没有键关系的联接更新表

[英]Update table via join without key relation

我有的:

两个表A和B。

A: Col1 Col2 Col3 Col1_Transformed Col2_Transformed

B: Col1 Col2 Col3

它们具有完全相同的列,除了一些修改过的数据外,它们都没有主键,唯一字段或其他任何东西(这是我需要处理的极端情况)。

表A仅包含表B的部分数据。可以说,我批量读取表B了10000行,然后修改了数据并将其写入表A(* _ Transform列)。

我需要的:

我需要使用表A中的数据更新表B。拥有主键或某些标识列将很容易:

UPDATE target
SET  target.Col1 = source.__Col1
FROM B target
join A as source 
ON  target.Id = source.Id  

但是我没有。

下一个自然猜测是中继由Col1 Col2 Col3组成的自然密钥。

UPDATE target
SET  target.Col1 = source.__Col1
FROM B target
join A as source 
ON  target.Col1 = source.Col1  AND 
    target.Col2 = source.Col2  AND 
    target.Col3 = source.Col3 

这个东西不起作用,原因是可能的NULL值比较。 如果target.Col1或source.Col1为NULL,则整个记录将从更新中省略。

猜想3(使用行号):

我想将row_number添加到表A,这将是我的关键。

答:row_numb Col1 Col2 Col3 Col1_Transformed Col2_Transformed

而不仅仅是加入表B:

UPDATE target
SET  target.Col1 = source.__Col1
FROM B target
join A as source 
ON  ROW_NUMBER() OVER(ORDER BY target.Col1,target.Col2,target.Col3) = source.ROW_NUMB  

Bur row_nubmer不能在join子句中使用。

有什么想法怎么做?

好像您希望NULL匹配联接,可以这样做:

UPDATE target
SET  target.Col1 = source.__Col1
FROM B target
join A as source 
ON  (target.Col1 = source.Col1 OR (target.Col1 IS NULL AND source.Col1 IS NULL)) AND -- most reliable way to do it
    ISNULL(target.Col2,'-1') = ISNULL(source.Col2,'-1')  AND -- less reliable but more concise, replace -1 by any data that cannot be in the tables
     (target.Col3 = source.Col3 OR (target.Col3 IS NULL AND source.Col3 IS NULL)) 

使用ISNULL修改查询

UPDATE target
SET  target.Col1 = source.__Col1
FROM B target
join A as source 
ON  IsNull(target.Col1,'') = IsNUll(source.Col1,'')  
    AND IsNull(target.Col2,'') = IsNull(source.Col2,'')  
    AND IsNull(target.Col3,'') = IsNull(source.Col3,'') 

CTE示例:

;With CTETableA 
AS
(
Select Col1,Col2,Col3,Col1_Transformed,Col2_Transformed
       ROW_NUMBER() OVER(ORDER BY Col1,Col2,Col3) id
       from A
),
CTETableB
As
(
Select Col1,Col2,Col3,ROW_NUMBER() OVER(ORDER BY Col1,Col2,Col3) id
       from B
)

UPDATE target
SET  target.Col1 = source.Col1
FROM CTETableB target
join CTETableA as source 
ON  target.Id = source.Id  

Insert into B(Col1)
Select Col1 from CTETableB 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM