根据 SQL 中的另一列填充列

Posted

技术标签:

【中文标题】根据 SQL 中的另一列填充列【英文标题】:Populate column based on another column in SQL 【发布时间】:2021-01-28 02:51:10 【问题描述】:

根据df1df2 的公共列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

即使您在查询中不需要df1df2 中提供了所有必需的值。

如果 df2 不包含某些 id,则使用 left join.

【讨论】:

OP 编写它的方式,听起来他们想要更新而不是“查看”数据。 知道了@DavidBrossard

以上是关于根据 SQL 中的另一列填充列的主要内容,如果未能解决你的问题,请参考以下文章

sql - 根据另一列动态填充结果集中的列

根据列中的状态更改创建触发器并在表的另一列中插入值

根据另一列自动填充 excel 中的字段

LINQ 根据计数 >1 的另一列获取列

在 pandas 中,如何根据一列中的唯一值创建列,然后根据另一列中的值填充它?

如何根据另一列中的单元格值有条件地填充熊猫列