Соединение строк в таблице msql
Есть необходимость считывать файлы из txt и заносить их в таблицу msql. Проблема заключается в том, что в txt файле строка разбита на 2. То есть половина данных, которые будут индексироваться как столбцы в 1 строке, а остальные данные, которые так же должны быть в 1 строке таблицы, во 2 строке txt. Есть ли способ на этапе заливки в msql соединить нечетные номера строк с четными или же в самом sql во временной таблице проделать тоже самое. Необходимо делать это именно в SQL. Знаю, что все легко делается с питоном, но нужен именно чистый sql.
Ответы (2 шт):
Пожалуйста, попробуйте следующее решение.
Оно использует временную таблицу.
Просто для лучшего понимания, вот какие данные поступают от CTE:
SELECT * FROM rs
+----+-------------+----+-----+--------+
| id | token | rn | odd | series |
+----+-------------+----+-----+--------+
| 1 | Forida | 1 | 1 | 2 |
| 2 | Miami | 2 | 0 | 2 |
| 3 | Texas | 3 | 1 | 4 |
| 4 | Dallas | 4 | 0 | 4 |
| 5 | California | 5 | 1 | 6 |
| 6 | Los Angeles | 6 | 0 | 6 |
+----+-------------+----+-----+--------+
SQL
-- DDL и образец вставки данных, начало
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, token VARCHAR(100));
INSERT INTO @tbl (token) VALUES
('Forida'),
('Miami'),
('Texas'),
('Dallas'),
('California'),
('Los Angeles');
-- DDL и образец вставки данных, конец
;WITH rs AS
(
SELECT *
, rn = ROW_NUMBER() OVER (ORDER BY id ASC)
, odd = ROW_NUMBER() OVER (ORDER BY id ASC) % 2
, series = ROW_NUMBER() OVER (ORDER BY id ASC) + (ROW_NUMBER() OVER (ORDER BY id ASC) % 2)
FROM @tbl
)
-- SELECT * FROM rs
SELECT series, result = STRING_AGG(token, ' - ')
FROM rs
GROUP BY series;
Результат
+--------+--------------------------+
| series | result |
+--------+--------------------------+
| 2 | Forida - Miami |
| 4 | Texas - Dallas |
| 6 | California - Los Angeles |
+--------+--------------------------+
Если это разовая акция и не требует автоматической загрузки подобных файлов, то следует сделать следующие шаги.
Подготовим тестовый файл test.txt, его содержимое:
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt
mollit anim id est laborum.
- Запустите MS Managment Studio, кликните правой кнопкой мыши по нужной базе, в которую необходимо занести данные, далее Tasks->Import Data... появится окно
- Жмём "Далее" и выбираем в Data Source источник "Flat File Source".
Слева жмём на столбцы и выбираем разделители как у меня на скрине
Потом жмём далее, далее, далее... Запоминаем только название таблицы импорта:
Шаг 3.
В нашем случае это DBO.TEST. Эта таблица создастся автоматически и у неё будут отсутствовать ключевые поля, добавим его сами:
ALTER TABLE dbo.test ADD ID INT IDENTITY
Ну и сам запрос в таком случае:
SELECT t1.[Столбец 0] + ' ' + ISNULL(t2.[Столбец 0], '') FROM dbo.test t1
LEFT JOIN dbo.test t2 ON t2.ID = t1.ID + 1
WHERE t1.ID % 2 = 1
Буду рад, если это то что нужно =)



