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”,因为这个关键字确实有效