Как вставить данные из одной таблицы в другую, если количество строк в одной строке неодинаково? - PullRequest
1 голос
/ 26 марта 2019

У меня есть таблица с именем People, в которой 19370 строк, а playerID - основной столбец. Есть еще одна таблица с именем Batting, которая имеет playerID в качестве внешнего ключа и имеет 104324 строки.

Мне сказали добавить новый столбец в таблицу People с именем Total_HR, который включен в таблицу Batting. Поэтому мне нужно вставить данные этого столбца из таблицы Batting в таблицу People.

Однако я получаю сообщение об ошибке:

Сообщение 515, Уровень 16, Состояние 2, Строка 183 Невозможно вставить значение NULL в столбец 'playerID', таблица 'Spring_2019_BaseBall.dbo.People'; колонка не допускает нулевые значения. Вставить не удается. Заявление было прекращено.

Я пробовал UPDATE и INSERT INTO SELECT, но получил ту же ошибку

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

Я ожидаю, что вывод заполнит столбец Total_HR в таблице People, используя столбец HR из таблицы Batting.

Ответы [ 3 ]

1 голос
/ 26 марта 2019

Вы можете использовать соединение

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 голос
/ 26 марта 2019

Из сообщения об ошибке кажется, что playerID является обязательным полем в таблице People.Вам необходимо указать все обязательные поля таблицы People в предложении INSERT INTO и указать соответствующие значения в предложении SELECT.

Я добавил поле playerID ниже, но вам может потребоваться добавить и дополнительные обязательные поля.

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

Странно, однако, что вы хотите вставить строки в таблицу, которая уже должна быть там.В противном случае вы не могли бы иметь действительный внешний ключ для поля playerID в таблице Batting ... Если вы попытаетесь вставить такие строки из таблицы 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
0 голосов
/ 26 марта 2019

Вам нужно вычислить SUM и затем объединить этот результат с таблицей People, чтобы привести в одинаковые строки как столбец Total_HR из People, так и соответствующую сумму, вычисленную из Batting.

Вот один из способов написать это.Я использовал 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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...