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

Я довольно новичок в SQL-запросах и не знаю, как к этому подойти: у меня есть CSV-файл, содержащий 5 столбцов, 2 из этих столбцов — Value1 и Value2, мне нужно запустить существующую таблицу sql (для цели этого вопроса, я назову его «целевой таблицей») и перебираю все строки в целевой таблице, проверяя их столбец Value1, если это содержимое Value1 равно содержимому в CSV, мне нужно вставить Value2 в столбец Value2 этой строки, если Значение1 не содержится в таблице, создайте для него новую строку.

На всякий случай, если я не понял, вот пример -

предполагая, что CSV выглядит следующим образом:

Name, Age, Location, Height, Weight
David, 12, Macedonia, 1.87, 96
Kim, 15, Denmark, 1.95, 67

Я хочу просмотреть существующий SQL и работать только в соответствии с именем и весом - если имя Дэвид находится в таблице, вставьте 96 в его столбец «Вес», если имя Ким находится в таблице, вставьте 67 в его столбец «Вес» и т. д. .. Если бы таблица содержала только Ким, а не Дэвида, тогда была бы создана строка Дэвида.

Я предполагаю, что мудрым способом было бы сначала заполнить пробелы «Value1», которых нет в таблице, и только затем запустить обновление «Value2», но я могу ошибаться.

Любая помощь будет высоко оценена, спасибо!


person user51929    schedule 18.04.2018    source источник
comment
Первым шагом здесь, вероятно, будет использование LOAD DATA для переноса вашего CSV-файла в MySQL. Затем побеспокойтесь о запросе для вашего обновления.   -  person Tim Biegeleisen    schedule 18.04.2018
comment
Вы можете установить Value1 как уникальный ключ в таблице. Затем используйте конструкцию «вставить игнор в вашу таблицу ..... при обновлении дублирующегося ключа .....».   -  person Yuri Lachin    schedule 18.04.2018


Ответы (1)


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

--Часть 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
)

--Часть 2: Установка уникального ключа; как предложил @Yuri_Lachin

Alter table target
Add Unique (Name) -- Sets Name column as a Unique Key for the table target

--Часть 3: Добавление строк и обновление значений из временной таблицы в постоянную. Отсылка к справочному руководству 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

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