Соединение строк в таблице msql

Есть необходимость считывать файлы из txt и заносить их в таблицу msql. Проблема заключается в том, что в txt файле строка разбита на 2. То есть половина данных, которые будут индексироваться как столбцы в 1 строке, а остальные данные, которые так же должны быть в 1 строке таблицы, во 2 строке txt. Есть ли способ на этапе заливки в msql соединить нечетные номера строк с четными или же в самом sql во временной таблице проделать тоже самое. Необходимо делать это именно в SQL. Знаю, что все легко делается с питоном, но нужен именно чистый sql.


Ответы (2 шт):

Автор решения: Yitzhak Khabinsky

Пожалуйста, попробуйте следующее решение.

Оно использует временную таблицу.

Просто для лучшего понимания, вот какие данные поступают от 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 |
+--------+--------------------------+
→ Ссылка
Автор решения: Andrew Nikolaev

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

Подготовим тестовый файл 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.
  1. Запустите MS Managment Studio, кликните правой кнопкой мыши по нужной базе, в которую необходимо занести данные, далее Tasks->Import Data... появится окно

введите сюда описание изображения

  1. Жмём "Далее" и выбираем в 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

Буду рад, если это то что нужно =)

→ Ссылка