根据 SQL 中的另一列填充列
Posted
技术标签:
【中文标题】根据 SQL 中的另一列填充列【英文标题】:Populate column based on another column in SQL 【发布时间】:2021-01-28 02:51:10 【问题描述】:根据df1
和df2
的公共列ID
,在df1
中用name
填充列A
的最佳方法是什么?
df1
ID A
122 nan
233 nan
...
df2
ID B name
122 10 real_name1
233 20 real_name2
...
得到:
ID A
122 real_name1
233 real_name2
...
编辑:
我还想将列名 A
更改为 new_column_name
,因此预期的输出如下所示:
ID new_column_name
122 real_name1
233 real_name2
...
更新:
试过了:
UPDATE t1
SET A = t2.name
FROM df1 t1
INNER JOIN df2 t2
ON t2.ID = t1.ID;
它发现了错误:
Msg 8152, Level 16, State 2, Line 48
String or binary data would be truncated.
The statement has been terminated.
更新2:
表定义
df1
:
CREATE TABLE [dbo].[df1](
[ID] [nvarchar](20) NULL,
[SUB_ID2] [nvarchar](15) NOT NULL,
[DATE] [datetime2](7) NULL,
[MONTH] [nvarchar](4000) NULL,
[QTY] [numeric](20, 8) NOT NULL,
[SUB_ID] [nvarchar](15) NOT NULL,
[X] [nvarchar](20) NULL,
[SUBURB_ID] [nvarchar](30) NULL,
[PROJECT_NAME] [nvarchar](160) NULL,
[A] [varchar](10) NOT NULL
) ON [PRIMARY]
df2
:
CREATE TABLE [dbo].[df2](
[ID] [nvarchar](46) NULL,
[NAME1] [nvarchar](50) NULL,
[IDx] [nvarchar](15) NULL,
[P] [nvarchar](50) NULL,
[Q] [nvarchar](50) NULL,
[Z] [nvarchar](50) NULL,
[Y] [nvarchar](30) NULL,
[MARK] [nvarchar](10) NULL,
) ON [PRIMARY]
【问题讨论】:
请同时标记您的 DBMS。 这看起来很像熊猫。你确定你在这里使用的是 SQL Server 吗? @TimBiegeleisen 是的,我正在使用 SSMS 请向我们展示您的尝试。 您需要使第一个表中的A
列更宽以适应第二个表中NAME1
列的更大宽度。
【参考方案1】:
如果你真的想更新第一个表,那么使用:
UPDATE t1
SET A = t2.name
FROM df1 t1
INNER JOIN df2 t2
ON t2.ID = t1.ID;
如果你真的想使用连接来表达更新逻辑,你可以使用可更新的 CTE:
WITH cte AS (
SELECT t1.A, t2.name
FROM df1 t1
INNER JOIN df2 t2 ON t2.ID = t1.ID
)
UPDATE cte
SET A = name;
【讨论】:
感谢您的回答。顺便说一句,您知道将列名A
更改为 new_column_name
的安全方法吗?
@nilsinelabore 请关注this highly viewed SO question 寻求帮助。
您好,谢谢,The multi-part identifier "b.name" could not be bound.
是什么意思?【参考方案2】:
这是简单的连接。
Select t1.id, t2.name as A
From df1 t1 join df2 t2 on t1.id = t2.id
即使您在查询中不需要df1
。 df2
中提供了所有必需的值。
如果 df2
不包含某些 id,则使用 left join.
【讨论】:
OP 编写它的方式,听起来他们想要更新而不是“查看”数据。 知道了@DavidBrossard以上是关于根据 SQL 中的另一列填充列的主要内容,如果未能解决你的问题,请参考以下文章