Я довольно новичок, когда речь заходит о SQL-запросах и не знаю, как подойти к этому: у меня есть файл CSV, содержащий 5 столбцов, 2 из этих столбцов - Value1 и Value2, мне нужно запустить существующую таблицу sql (для в этом вопросе я буду называть его "целевой таблицей") и перебирать все строки в целевой таблице, проверяя их столбец Value1, если это значение Value1 равно тому, которое находится в CSV. Мне нужно вставить Value2 в столбец Value2 этой строки, если Value1 не содержится в таблице, создайте для него новую строку.
На всякий случай я не был ясен, вот пример -
если CSV выглядит следующим образом:
Name, Age, Location, Height, Weight
David, 12, Macedonia, 1.87, 96
Kim, 15, Denmark, 1.95, 67
Я хочу использовать существующий SQL и работать только по имени и весу - если имя David находится в таблице, вставьте 96 в столбец "Вес", если имя Kim находится в таблице, вставьте 67 в его столбец "Вес" и т.д... Если бы в таблице содержался только Ким, а не Давид, тогда была бы создана строка Дэвида.
Я предполагаю, что разумным способом было бы сначала заполнить пробелы "Value1", которые не существуют в таблице, и только затем запустить обновление в "Value2", но я могу ошибаться.
Любая помощь будет очень признательна, спасибо!
Теоретически, я думаю, это должно сработать для вас.
--Part 1: очистить/создать временную таблицу и загрузить CSV в SQL. Отметьте mr_eclair для описания этого процесса здесь
drop table #temp
create table #temp (
tName nvarchar(25),
tAge int,
tLocation nvarchar(25),
tHeight float(3,2), -- alternatively, use cm instead of m and just use int(3)
tWeight int
)
BULK INSERT #temp
FROM 'C:\CSVData\updates.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '\n', --Use to shift the control to next row
TABLOCK
)
--Part 2: установка уникального ключа; как было предложено @Yuri_Lachin
Alter table target
Add Unique (Name) -- Sets Name column as a Unique Key for the table target
--Part 3: Добавление строк и Обновление значений из таблицы temp в постоянную таблицу. Кредит на MySQL 5.7 Справочное руководство 13.2.5.2
Insert into target(Name, Age, Location, Height, Weight)
Select tName, tAge, tLocation, tHeight, tWeight from #temp
On DUPLICATE KEY Update Weight = tWeight
Я собирался предложить использовать оператор Merge, как показано ниже, но похоже, что MySQL не справляется с этими задачами.
Merge Into people
using #temp
on target.name = #temp.tname
when matched then Update
set target.weight = #temp.tweight
when not matched then
Insert (target.name, target.age, target.location, target.height, target.weight)
values (#temp.tname, #temp.tage, #temp.tlocation, #temp.theight, #temp.tweight);
LOAD DATA
для переноса вашего CSV-файла в MySQL. Затем позаботьтесь о запросе вашего обновления.