Sql 当一个表中的行数不相等时,如何将数据从一个表插入到另一个表中?
我有一个名为Sql 当一个表中的行数不相等时,如何将数据从一个表插入到另一个表中?,sql,sql-server,Sql,Sql Server,我有一个名为People的表,它有19370行,playerID是主列。还有另一个名为Batting的表,它将playerID作为外键,有104324行 我被告知在人员表中添加一个名为Total_HR的新列,该列包含在击球表中。因此,我必须将Batting表中的列数据插入People表中 但是,我得到了一个错误: Msg 515,16级,状态2,第183行不能将值NULL插入 “playerID”列,表“Spring_2019_barball.dbo.People”;柱 不允许空值。插入失败。声
People
的表,它有19370行,playerID
是主列。还有另一个名为Batting
的表,它将playerID
作为外键,有104324行
我被告知在人员
表中添加一个名为Total_HR
的新列,该列包含在击球
表中。因此,我必须将Batting
表中的列数据插入People
表中
但是,我得到了一个错误:
Msg 515,16级,状态2,第183行不能将值NULL插入
“playerID”列,表“Spring_2019_barball.dbo.People”;柱
不允许空值。插入失败。声明已终止
我尝试了UPDATE
和INSERT-INTO-SELECT
,但是得到了相同的错误
insert into People (Total_HR)
select sum(HR) from Batting group by playerID
我希望输出使用
Batting
表中的HR
列填充People
表中的Total\u HR
列。人员
以及根据击球
计算的相应总和
这里有一种写它的方法。我用CTE使它更具可读性
WITH
CTE_Sum
AS
(
SELECT
Batting.playerID
,SUM(Batting.HR) AS TotalHR_Src
FROM
Batting
GROUP BY
Batting.playerID
)
,CTE_Update
AS
(
SELECT
People.playerID
,People.Total_HR
,CTE_Sum.TotalHR_Src
FROM
CTE_Sum
INNER JOIN People ON People.playerID = CTE_Sum.playerID
)
UPDATE CTE_Update
SET
Total_HR = TotalHR_Src
;
你可以加入
BEGIN TRAN
Update People
Set Total_HR = B.HR_SUM
from PEOPLE A
left outer join
(Select playerID, sum(HR) HR_SUM
from Batting
group by playerID) B on A.playerID = B.playerID
Select * from People
ROLLBACK
请注意,我已将此代码放在一个事务块中,以便您可以在提交之前测试更改。从错误消息来看,playerID似乎是People表中的必填字段。
您需要在INSERT INTO子句中指定表人物的所有必填字段,并在SELECT子句中提供相应的值
我在下面添加了field playerID,但您可能还需要添加其他必填字段
insert into People (playerID, Total_HR)
select playerID, sum(HR) from Batting group by playerID
然而,奇怪的是,您想要在一个应该已经存在的表中插入行。否则,您无法在表击球中的field playerID上拥有有效的外键。。。如果试图将这些行从表Batting插入到表People中,可能会出现另一个错误(违反主键约束)。。。除非。。。您刚才正在创建数据库,并且希望在向表人员添加实际外键约束之前,通过填充/导入的表打击填充空表人员。对不起,我不会怀疑你的意图。我个人会考虑更新查询,这样它就不会尝试插入表中已经存在的任何行:
insert into People (playerID, Total_HR)
select Batting.playerID, sum(Batting.HR)
from Batting
left join People on People.playerID = Batting.playerID
where People.playerID is null and Batting.playerID is not null
group by playerID
我是否要添加关键字“commit”来代替“rollback”,因为这个关键字确实有效