根据 SQL 中的另一列填充列
Populate column based on another column in SQL
根据 df1
和 [=24= 的公共列 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:
Table 定义
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]
这是简单的连接。
Select t1.id, t2.name as A
From df1 t1 join df2 t2 on t1.id = t2.id
即使您在查询中不需要 df1
。 df2
.
中提供了所有必需的值
如果 df2
不包含某些 id 则使用 left join.
如果您真的想更新第一个table,那么使用:
UPDATE t1
SET A = t2.name
FROM df1 t1
INNER JOIN df2 t2
ON t2.ID = t1.ID;
如果您真的想使用连接来表达更新逻辑,您可以使用更新table 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;
根据 df1
和 [=24= 的公共列 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:
Table 定义
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]
这是简单的连接。
Select t1.id, t2.name as A
From df1 t1 join df2 t2 on t1.id = t2.id
即使您在查询中不需要 df1
。 df2
.
如果 df2
不包含某些 id 则使用 left join.
如果您真的想更新第一个table,那么使用:
UPDATE t1
SET A = t2.name
FROM df1 t1
INNER JOIN df2 t2
ON t2.ID = t1.ID;
如果您真的想使用连接来表达更新逻辑,您可以使用更新table 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;