【问题标题】:Sqlite insert both even and odd rows in one expressionSqlite 在一个表达式中同时插入偶数行和奇数行
【发布时间】:2019-12-11 16:17:28
【问题描述】:

我正在使用 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 [Table] ( 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这句话能做到吗?或者如何更新新表?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    只需根据以下条件将表与自身连接起来。如果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.
    【解决方案2】:

    在聚合中使用透视逻辑:

    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;
    

    Demo

    【讨论】:

    • 这似乎是一种非常强大的建表方式!
    【解决方案3】:

    另一种方法,使用 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  
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 2012-06-06
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2013-06-10
      相关资源
      最近更新 更多