簡體   English   中英

當彼此之間的行數不相等時,如何將數據從一個表插入到另一個表?

[英]How do I insert data from one table to another when there is unequal number of rows in one another?

我有一個名為People的表,該表有19370行,其中playerID是主列。 還有另一個名為Batting表,該表具有playerID作為外鍵,並且具有104324行。

有人告訴我在“ People表中添加一個名為Total_HR的新列,該列包含在“ Batting表中。 因此,我必須將“ Batting表中的列數據插入“ People表中。

但是,我得到了錯誤:

消息515,級別16,狀態2,行183無法將值NULL插入表'Spring_2019_BaseBall.dbo.People'的列'playerID'中; 列不允許為空。 INSERT失敗。 該語句已終止。

我已經嘗試過UPDATEINSERT INTO SELECT ,但是遇到了同樣的錯誤

insert into People (Total_HR)
select sum(HR) from Batting group by playerID

我希望輸出使用“ Batting表中的“ HR列填充“ People表中的“ Total_HR ”列。

您可以使用聯接

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子句中指定表People的所有必填字段,並在SELECT子句中提供相應的值。

我在下面添加了字段playerID,但您可能還需要添加其他必填字段。

insert into People (playerID, Total_HR)
select playerID, sum(HR) from Batting group by playerID

但是,很奇怪,您想在應該已經存在的表中插入行。 否則,您可能在表Batting中的字段playerID上沒有有效的外鍵...如果嘗試將表Batting中的此類行插入表People中,則可能會遇到另一個錯誤(違反PRIMARY KEY約束)...除非。 ..您正在創建數據庫,並且想要在將實際外鍵約束添加到表People之前,從填充/導入的表Batting中填充空表People。 對不起,我不會質疑你的意圖。 我個人將考慮對查詢進行某種程度的更新,以便它不會嘗試插入表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

您需要計算SUM ,然后將此結果連接到People表,以將People Total_HR列和Batting計算的相應SUM放入同一行。

這是一種編寫方法。 我使用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
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM