没有匹配项时如何更新row = NULL

h

我有2张桌子,像这样:

CREATE TABLE #targetTable(id int,date datetime,name varchar(50));
CREATE TABLE #sourceTable(id int,date datetime,name varchar(50));
INSERT INTO #targetTable  values(1,'1905-07-08 00:00:00.000','John');
INSERT INTO #targetTable values(2,'1905-07-08 00:00:00.000','Albrt');
INSERT INTO #targetTable  values(3,'1905-07-08 00:00:00.000','Roy');

INSERT INTO #sourceTable values(1,'1905-07-09 00:00:00.000','jame');

我想更新目标表,当不匹配时,然后用NULL更新目标的名称列。我想要这个结果:

id   date                     name
1   1905-07-09 00:00:00.000    jame
2   1905-07-09 00:00:00.000    null
3   1905-07-09 00:00:00.000    null

我的测试查询无法正常工作:错误:未匹配时不允许进行更新。反正有没有编辑查询以获取结果?

merge into #targetTable a 
using #sourceTable b on a.id=b.id 
when matched and b.date > a.date then
   update 
   set a.name=b.name,a.date=b.date 
when not matched by Target then 
   update a.date=b.date and a.name = null 

它告诉我错误。您能帮我得到结果吗?

马克·舒尔蒂斯

阅读问题和所有评论后,您真正想要的是

  • UPDATE基于该行id同时与datename而设置的name,以NULL当没有比赛,并设置date在同一时间与条件,以最大的日期。
  • UPDATE匹配时使用新值(namedateid

为了简单起见,我在这里使用了一个表变量,但是概念是相同的。

给定表和数据,将产生:

DECLARE  @targetTable TABLE (id int,date datetime,name varchar(50));
DECLARE  @sourceTable TABLE (id int,date datetime,name varchar(50));
INSERT INTO @targetTable  
VALUES
(1,'1905-07-08 00:00:00.000','John'),
(2,'1905-07-08 00:00:00.000','Albrt'),
(3,'1905-07-08 00:00:00.000','Roy');

INSERT INTO @sourceTable values(1,'1905-07-09 00:00:00.000','jame');

SELECT  id,date,name  FROM @targetTable;
SELECT  id,date,name  FROM @sourceTable;

id  date    name
1   1905-07-08 00:00:00.000 John
2   1905-07-08 00:00:00.000 Albrt
3   1905-07-08 00:00:00.000 Roy

id  date    name
1   1905-07-09 00:00:00.000 jame

您想要的基本上与此选择语句相同:

SELECT 
    t.id,
    CASE 
        WHEN s.id IS NOT NULL THEN s.[date]
        ELSE (SELECT MAX([date]) FROM @sourceTable )
    END AS [date],
    CASE 
        WHEN s.id IS NULL THEN NULL
        ELSE s.name
    END AS [name]
FROM @targetTable AS t
LEFT OUTER JOIN  @sourceTable AS s
    ON t.id = s.id;

为此,我们可以将其合并到更新中:

UPDATE @targetTable
    SET [date] = CASE 
        WHEN s.id IS NOT NULL THEN s.[date]
        ELSE (SELECT MAX([date]) FROM @sourceTable )
    END,
    [name] = CASE 
        WHEN s.id IS NULL THEN NULL
        ELSE s.name
    END
FROM @targetTable AS t
LEFT OUTER JOIN  @sourceTable AS s
    ON t.id = s.id;

最终输出

SELECT id,date,name  FROM @targetTable;

id  date                    name
1   1905-07-09 00:00:00.000 jame
2   1905-07-09 00:00:00.000 NULL
3   1905-07-09 00:00:00.000 NULL

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么没有警告null == null?

是否有没有“ null”的语言?

用gcc返回NULL时没有警告

findUpAndUpdate()在更新时返回null

为什么检查null的长度时没有出现错误

如何从查询中获取NULL而不是没有值

当grep中没有匹配项时,如何添加输出“ non_assigned”?

Postgres JSONb更新(在Json数组内部),当找不到匹配项或参数为null时,删除数组中的所有元素吗?

加载bq时,VARCHAR(30)NOT NULL的'NULL'值被视为null

没有变量数据时添加NULL

用先前的NOT NULL行更新NULL行

SQL查询:两个表之间没有保留关系时如何显示NULL

使用Row_Number时如何跳过NULL(或0)?

GWT null没有属性

当相关表中没有匹配项时,将字段更新为空值

不为null时的SQL更新

调用null对象的方法后,没有null指针异常

如果ON条件在MySQL中没有匹配的数据,如何获取NULL

当“匹配”没有匹配项时,如何避免破坏JavaScript?

尽管包含匹配项,但RegExp返回null

NOT NULL 时将多行更新为 NULL

当没有 NULL 值时,在 Oracle 中出现错误“ORA-01400:无法将 NULL 插入...”

PostgresSQL - 当左连接中没有值时,如何获取字符串而不是 NULL?

匹配xml时如何忽略值是否为NULL

在列中查找特定匹配项,如果该 id 没有该值,则返回 null

当表在 SQL Server 中没有行时如何打印 NULL?

为什么 char 指针没有更新为 NULL

SQL:匹配包含 NULL 值和字符串的两列,并仅提取没有 NULL 的匹配行

如何显示没有NULL的mysql查询?