Mysql запрос - вставить из условного CSV для сравнения между таблицей и CSV

0

Я довольно новичок, когда речь заходит о 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", но я могу ошибаться.

Любая помощь будет очень признательна, спасибо!

  • 1
    Первым шагом здесь, вероятно, будет использование LOAD DATA для переноса вашего CSV-файла в MySQL. Затем позаботьтесь о запросе вашего обновления.
  • 1
    Вы можете установить Value1 как уникальный ключ в таблице. Затем используйте конструкцию «insert ignore в yourtable ..... при обновлении дублированного ключа .....».
Теги:
database
csv
sequelpro

1 ответ

1
Лучший ответ

Теоретически, я думаю, это должно сработать для вас.

--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);
  • 0
    Большое спасибо, это сработало отлично, единственное, что я нахожу немного забавным, это то, что при написании Weight = tWeight мне действительно нужно иметь по-разному именованные столбцы в каждой таблице вместо того, чтобы делать что-то вроде destination.Weight = source. Вес или что-то в этом роде :), еще раз спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню