使用另一个表列更新列

Update column using another table column

提问人:aasenomad 提问时间:10/10/2023 最后编辑:Dale Kaasenomad 更新时间:10/10/2023 访问量:91

问:

我有一张看起来像这样的表格

表1

Source                 OriginalCreatedDate
[email protected]        2022-12-24 06:01:25.000
[email protected]        

表2

Source                 CreatedDate
[email protected]        2022-12-24 06:01:25.000
[email protected]        2023-08-07 02:01:25.000

我只是想知道如何使用 Table1 CreatedDate 列更新表 2 OriginalCreatedDate 列。

我相信我需要使用 Source 列来比较这两个表,但我只是想知道如何更新仅具有 null 或 '' 值的 Table1 行。我想忽略已经具有 OriginalCreatedDate 值的行。

UPDATE Table1
    SET Original_CreatedDate = ISNULL((
        SELECT Top 1 Table2.CreatedDate
        FROM Table2
        WHERE Table2.Source = Table1.Source
    ), Table1.Original_CreatedDate)
        GO

任何帮助或建议将不胜感激

sql sql-server sql-server-2012 多列

评论

0赞 Sean Lange 10/10/2023
在 update 语句中使用联接。此外,您确实需要制定升级计划。SQL Server 2012 已完全停止支持一年多。
0赞 Thom A 10/10/2023
您是否查看过文档中的示例?他们呢,你不明白吗?
0赞 aasenomad 10/10/2023
@ThomA我不确定如何使用 Sean 提到的连接。
0赞 aasenomad 10/10/2023
我现在拥有的代码正在更新所有内容。请检查上面的代码
0赞 Thom A 10/10/2023
比如在[这个例子]中)(learn.microsoft.com/en-us/sql/t-sql/queries/...)?再说一遍,关于xamples,你不明白吗?这不是一个子查询。JOIN

答:

2赞 Ivan Yuzafatau 10/10/2023 #1
UPDATE t1
SET
  OriginalCreatedDate = t2.CreatedDate
FROM
  Table1 AS t1
  JOIN Table2 AS t2 ON t1.Source = t2.Source
WHERE
  (t1.OriginalCreatedDate IS NULL) OR (t1.OriginalCreatedDate = '')

评论

0赞 aasenomad 10/10/2023
嗨,伊万,非常感谢你,看起来它有效,但快速提问。您知道为什么在表 1 OriginalCreatedDate 列中更改了日期时间格式吗?它没有插入与 Table2 CreatedDate 列相同的格式。例如,Table2 = 2022-12-24 06:01:25.000,但在表 1 “Dec 24 2022 6:01AM” 中如下所示
2赞 siggemannen 10/10/2023
因为您使用的是 varchar 而不是 date 数据类型
0赞 aasenomad 10/10/2023
@siggemannen 哦,好的,有没有办法修复它以使其具有与 Table2 相同的格式?
1赞 Stuck at 1337 10/10/2023
@aasenomad为什么?I'm using Varchar
2赞 Sean Lange 10/10/2023
@aasenomad将 varchar 用于日期是一个糟糕的决定。为什么?
1赞 Stuck at 1337 10/10/2023 #2

实际上,您不应该用于这些列中的任何一个。你得到的格式差异,因为你存储字符串时你根本不用担心格式,因为日期/时间值不是字符串varchar

为了处理您当前的场景,其中源目标可以是 NULL、空字符串、任意数量的空格或垃圾,我会这样做:

UPDATE t1 SET Original_CreatedDate = 
    CONVERT(char(11), TRY_CONVERT(date, t2.CreatedDate), 120)
    + ' ' +
    CONVERT(char(12), TRY_CONVERT(time, t2.CreatedDate), 121)
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.Source = t2.Source
WHERE TRY_CONVERT(datetime, 
  NULLIF(RTRIM(t1.Original_CreatedDate),'')) IS NULL;

但实际上,您应该修复这些列,使它们首先成为正确的数据类型,或者至少使用约束来保护它们,以便垃圾被拒绝。如果两列都是,则解决方案会简单得多。datetime

评论

0赞 Ivan Yuzafatau 10/10/2023
看起来 RTRIM 在这里是多余的。“NULLIF(' ','')” 也将返回 NULL。
0赞 Stuck at 1337 10/10/2023
@Ivan无论如何,我宁愿明确,也不愿保存 5 个字符并依赖记忆 SQL Server 中一个更不一致的东西(它如何处理尾随空格)。