Sqlite вставляет как четные, так и нечетные строки в одном выражении - PullRequest
1 голос
/ 31 октября 2019

Я использую sqlite3, и у меня есть таблица sqlite, которая имеет несколько дублированных / перекрывающихся столбцов. Для иллюстрации:

       No    Col1  Col2  Col3  Col4
row1   1       1     1     2     2
row2   2       1     1     3     3
row3   3       2     2     4     4
row4   4       2     2     5     5

Col1 и Col2 хранят одну и ту же информацию, однако Col3 и Col4 содержат разную информацию.

Я хочу сжать строки в одну строку, например:

        No    Col1  Col2  Col3  Col4  Col3.2  Col4.2
row1     1     1     1     2     2     3     3
row3     3     2     2     4     4     5     5

Я создал новую таблицу со столбцами и смог выбрать нечетные строки.

INSERT INTO [LRP Dマシン2] ( No, Col1, Col2, Col3, Col4                            
                        )
                        SELECT No, Col1, Col2, Col3, Col4  
                          FROM [Table]
                         WHERE ([No] % 2) = 1
                         ORDER BY [No];

Таблица результатов будет выглядеть примерно так:

      No  Col1  Col2  Col3  Col4 Col3.2 Col4.2
row1  1     1     1    2     2    null   null
row3  3     2     2    4     4    null   null

Теперь я не уверен, как вставить четные значения в новую таблицу. Используя похожие выражения, вставьте только больше строк. Можно ли сделать это выражение INSERT INTO в одном предложении? Или как мне обновить новую таблицу?

Ответы [ 3 ]

2 голосов
/ 31 октября 2019

Просто объедините таблицу с самим собой, исходя из следующих условий. Это даже будет работать, если в столбце No есть пробелы:

SELECT o.No, o.Col1, o.Col2, o.Col3, o.Col4, e.Col3, e.Col4
FROM t AS o
INNER JOIN t AS e ON  o.Col1 = e.Col1
                  AND o.Col2 = e.Col2
                  AND o.No < e.No
1 голос
/ 31 октября 2019

Другой подход, использующий оконные функции, добавленные в sqlite 3.25:

CREATE TABLE table2(no INTEGER PRIMARY KEY, col1, col2, col3, col4, "col3.2", "col4.2");
INSERT INTO table2
SELECT *
FROM (SELECT no, col1, col2, col3, col4, lead(col3) OVER win, lead(col4) OVER win
      FROM table1
      WINDOW win AS (ORDER BY no))
WHERE no % 2 = 1;

, что дает

SELECT * FROM table2;
no          col1        col2        col3        col4        col3.2      col4.2    
----------  ----------  ----------  ----------  ----------  ----------  ----------
1           1           1           2           2           3           3         
3           2           2           4           4           5           5  
1 голос
/ 31 октября 2019

Использование логики поворота с агрегацией:

SELECT
    MIN(No) AS No,
    MAX(CASE WHEN No % 2 = 1 THEN Col1 END) AS Col1,
    MAX(CASE WHEN No % 2 = 1 THEN Col2 END) AS Col2,
    MAX(CASE WHEN No % 2 = 1 THEN Col3 END) AS Col3,
    MAX(CASE WHEN No % 2 = 1 THEN Col4 END) AS Col4,
    MAX(CASE WHEN No % 2 = 0 THEN Col1 END) AS Col1_2,
    MAX(CASE WHEN No % 2 = 0 THEN Col2 END) AS Col2_2,
    MAX(CASE WHEN No % 2 = 0 THEN Col3 END) AS Col3_2,
    MAX(CASE WHEN No % 2 = 0 THEN Col4 END) AS Col4_2
FROM yourTable
GROUP BY
    (No-1) / 2;

screen capture of demo link below

Демо

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