关于sql:MERGE也插入NULL记录

MERGE is inserting NULL records also

我使用以下语句来更新/插入记录。 问题是我已经给出条件SOURCE.Name IS NOT NULL,但我仍然在insert语句中得到一个错误:

Cannot insert the value NULL into column 'Name', table 'TEST2'; column does not allow nulls. UPDATE fails.

那是因为TARGET表中的Name列有一个NOT NULL约束。 我只是不想插入任何包含NULL作为名称的记录。 另外,我也不想更新TAGRET表中Name为NULL的任何行。

1
2
3
4
5
6
7
8
9
10
11
12
13
MERGE TEST2 AS TARGET      
USING TEST1 AS SOURCE    
ON TARGET.ID = SOURCE.ID
AND SOURCE.Name IS NOT NULL  
WHEN MATCHED THEN                          
    UPDATE SET ID=SOURCE.ID,
               Name= SOURCE.Name,
               City= SOURCE.City,
               State = SOURCE.State

WHEN NOT MATCHED THEN
INSERT (ID, Name, City, State)
VALUES(SOURCE.ID, SOURCE.Name, SOURCE.City, SOURCE.State);


ON子句仅确定用于确定"匹配"是什么的标准,因此确定采用什么分支。 它不是过滤器。

如果ON子句不匹配,那么您将转到WHEN NOT MATCHED分支,因此在您的情况下,即使id匹配但源名称为null,这也将适用。

可以将这些附加谓词添加到各个分支。 例如。

1
WHEN NOT MATCHED AND SOURCE.Name IS NOT NULL

但是因为你没有WHEN NOT MATCHED BY SOURCE的分支,并且你所拥有的两个分支都将排除NULL,你也可以使用表表达式来预先过滤掉这些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MERGE TEST2 AS TARGET
USING (SELECT *
       FROM   TEST1
       WHERE  Name IS NOT NULL) AS SOURCE
ON TARGET.ID = SOURCE.ID
WHEN MATCHED THEN
  UPDATE SET ID = SOURCE.ID,
             Name = SOURCE.Name,
             City = SOURCE.City,
             State = SOURCE.State
WHEN NOT MATCHED THEN
  INSERT (ID,
          Name,
          City,
          State)
  VALUES(SOURCE.ID,
         SOURCE.Name,
         SOURCE.City,
         SOURCE.State);


您只需在WHEN NOT MATCHED中添加AND条件,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
MERGE TEST2 AS TARGET      
USING TEST1 AS SOURCE    
ON TARGET.ID = SOURCE.ID
AND SOURCE.Name IS NOT NULL  
WHEN MATCHED THEN                          
    UPDATE SET ID=SOURCE.ID,
               Name= SOURCE.Name,
               City= SOURCE.City,
               State = SOURCE.State

WHEN NOT MATCHED AND SOURCE.Name IS NOT NULL THEN
INSERT (ID, Name, City, State)
VALUES(SOURCE.ID, SOURCE.Name, SOURCE.City, SOURCE.State);