我有一个名为People
的表,该表有19370行,其中playerID
是主列。还有一个名为Batting
的表,该表具有playerID
作为外键并具有104324行。
有人告诉我在People
表的Total_HR
表中添加一个新列,该列包含在Batting
表中。因此,我必须将Batting
表中的列数据插入People
表中。
但是,我得到了错误:
消息515,级别16,状态2,行183无法将值NULL插入 列“ playerID”,表“ Spring_2019_BaseBall.dbo.People”;柱 不允许为空。 INSERT失败。该声明已终止。
我尝试过UPDATE
和INSERT INTO SELECT
,但是遇到了相同的错误
insert into People (Total_HR)
select sum(HR) from Batting group by playerID
我希望输出使用Total_HR
表中的People
列填充HR
表中的Batting
列。
答案 0 :(得分:1)
您可以使用联接
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
请注意,我已将此代码放在事务块中,以便您可以在提交前测试更改
答案 1 :(得分:1)
从错误消息看来,playerID是表People中的必填字段。 您需要在INSERT INTO子句中指定表People的所有必填字段,并在SELECT子句中提供相应的值。
我在下面添加了字段playerID,但您可能还需要添加其他必填字段。
\2
但是,很奇怪,您想在应该已经存在的表中插入行。否则,您可能在表“击球”中没有字段playerID上的有效外键...如果尝试将表“击球”中的此类行插入表“人”中,则可能会遇到另一个错误(违反了PRIMARY KEY约束)...除非。 ..您正在创建数据库,并且想要在将实际外键约束添加到表People之前,从填充/导入的表Batting中填充空表People。对不起,我不会质疑你的意图。我个人将考虑对查询进行某种程度的更新,以便它不会尝试插入表People中已经存在的任何行:
insert into People (playerID, Total_HR)
select playerID, sum(HR) from Batting group by playerID
答案 2 :(得分:0)
您需要计算SUM
,然后将此结果结合到People
表中,以将来自Total_HR
的{{1}}列和计算出的相应SUM放入相同的行中来自People
。
这是一种编写方法。我使用CTE使其更具可读性。
Batting