提问人:aasenomad 提问时间:10/10/2023 最后编辑:Dale Kaasenomad 更新时间:10/10/2023 访问量:91
使用另一个表列更新列
Update column using another table column
问:
我有一张看起来像这样的表格
表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
任何帮助或建议将不胜感激
答:
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 中一个更不一致的东西(它如何处理尾随空格)。
评论
JOIN