Массовая вставка - создание значений некоторых столбцов на основе известных значений другого столбца. - PullRequest
0 голосов
/ 29 марта 2019

Я создаю базу данных по странам и годам. У меня есть таблица стран, которая включает название каждой страны, код ООН (числовой), двухзначный буквенный код, трехзначный буквенный код и код ISO.

В этой базе данных будет много других таблиц, строки которых содержат коды стран, год и интересующую точку данных. Например, строки таблицы «общая численность населения» будут включать год, численность населения и коды ООН, альфа-2, альфа-3 и ISO для страны, которой соответствует запись. Таким образом, для любой конкретной страны будет много записей (по одной в год).

Задача: я получаю данные из нескольких источников, и разные источники используют разные системы кодирования. Я использую файлы CSV для импорта всех данных. Например, вот запрос, который загружает данные для таблицы стран.

LOAD DATA LOCAL INFILE 'data/countryCodes.csv'
INTO TABLE Countries
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(country_name, alpha2_code, alpha3_code, un_code, iso_code);

Конечно, любой данный код ООН соответствует только одному 2-значному альфа-коду, одному 3-значному альфа-коду и одному ISO-коду. Я хочу иметь возможность импортировать CSV, который включает только один из этих кодов, и чтобы база данных автоматически заполняла записи других кодов для каждой строки. Например, если я импортирую данные о населении, закодированные кодом ООН, база данных будет автоматически ссылаться на соответствующие другие коды в таблице стран и вставлять соответствующие значения.

Есть ли способ сделать это с помощью SQL? Если я создам эту функцию в базе данных, будет намного проще систематизировать связи между сервером и клиентом между различными типами данных.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019
  1. Определите, какую country_code использовать для country_code везде. (Вы сохраните таблицу, которую вы описали, которая показывает соответствие между ISO, ООН и т. Д.)
  2. LOAD DATA ... - но не прямо в реальную таблицу. Вместо этого в таблицу t.
  3. Добавьте столбец к t, затем найдите каждый код в таблице ISO / UN / etc и введите значение country_code.
  4. Затем скопируйте строки из t в реальную таблицу. Обратите внимание, что «реальная» таблица будет иметь только предпочтительный country_code.

Основным принципом здесь является очистка и канонизация разрозненных данных как часть процесса загрузки. Конечно, требуется дополнительный шаг, но оно того стоит. Держите свой «настоящий» стол в чистоте.

Что вы будете делать с Чехословакией -> Чехия + Словакия? И Югославия. А Верхняя Вольта -> Буркина-Фасо? И т.д.

0 голосов
/ 29 марта 2019

Честно говоря, мне трудно понять, в чем ваша проблема / что вы действительно хотите сделать ...

Для использования на уровне базы данных ваш окончательный набор данных должен выглядеть следующим образом:

Таблица код страны

+----+----+-----+----+----+
| id | un | iso | a2 | a3 |
+----+----+-----+----+----+
| 1  | FR | FR  | FR | FR |
| 2  | .. | ..  | .. | .. |
+----+----+-----+----+----+

Таблица населения

+----+------+-----------+----------+
| id | year | idCountry | value    |
+----+------+-----------+----------+
| 1  | 1979 | 1         | 50000000 |
| 2  | 1980 | 1         | 50000000 |
+----+------+-----------+----------+

Чтобы преобразовать «прямое» значение из CSV в значение индекса, можно сделать что-то вроде этого:

ALTER TABLE population ADD extCC CHAR(2);
LOAD DATA LOCAL INFILE 'data/population.csv'
INTO TABLE population (year,value,extCC)
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS (extCC, year, value);

UPDATE population, countryCode SET population.idCountry=countryCode.id WHERE countryCode.iso = population.extCC;

ALTER TABLE population DROP extCC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...