Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何建立一个;如有其他",;插入中的SQL查询?_Sql_Sqlite - Fatal编程技术网

我如何建立一个;如有其他",;插入中的SQL查询?

我如何建立一个;如有其他",;插入中的SQL查询?,sql,sqlite,Sql,Sqlite,我试图将列从一个SQLite表复制到另一个SQLite表,但将布尔值(0或1)替换为枚举(0到9)。一个给定的项可以在表中出现两次-每个布尔设置一次。我希望优先使用true布尔值复制记录,如果不存在,则我希望使用false布尔值复制记录 有没有一种方法可以在单个查询中实现这一点 我已经在下面介绍了我当前的方法,但这需要在同一组表上运行多个查询,因此效率低于一个查询 // Table schemas Table1(Col1 text, Col2 text, Col3_bool int, Col4

我试图将列从一个SQLite表复制到另一个SQLite表,但将布尔值(0或1)替换为枚举(0到9)。一个给定的项可以在表中出现两次-每个布尔设置一次。我希望优先使用
true
布尔值复制记录,如果不存在,则我希望使用
false
布尔值复制记录

有没有一种方法可以在单个查询中实现这一点

我已经在下面介绍了我当前的方法,但这需要在同一组表上运行多个查询,因此效率低于一个查询

// Table schemas
Table1(Col1 text, Col2 text, Col3_bool int, Col4 int, Primary Key(Col1, Col2, Col3))
Table2(Col1 text, Col2 text, Col3_enum int, Col4 int, Primary Key(Col1, Col2, Col3))

// Pseudo code
for (int i = 0; i < 10; ++i)
{
    insert into Table2 select Col1, Col2, i, Col4 from Table1 where Col3_bool = 0;
    insert or replace into Table2 select Col1, Col2, i, Col4 from Table1 where Col3_bool = 1;
}
//表架构
表1(Col1文本、Col2文本、Col3_bool int、Col4 int、主键(Col1、Col2、Col3))
表2(Col1 text,Col2 text,Col3_enum int,Col4 int,主键(Col1,Col2,Col3))
//伪码
对于(int i=0;i<10;++i)
{
插入表2中,从表1中选择Col1,Col2,i,Col4,其中Col3_bool=0;
在表2中插入或替换,从表1中选择Col1、Col2、i、Col4,其中Col3_bool=1;
}

只要对所有查询使用单个事务,就不太可能有明显的性能差异

对于每个
Col1
/
Col2
组合,您需要最大
Col3
值:

SELECT Col1, Col2, MAX(Col3_bool)
FROM Table1
GROUP BY Col1, Col2
然后可以使用这些值来获取所需的行:

SELECT Table1.Col1,
       Table1.Col2,
       Table1.Col3_bool,
       Table1.Col4
FROM Table1
JOIN (SELECT Col1,
             Col2,
             MAX(Col3_bool) AS Col3_bool
      FROM Table1
      GROUP BY Col1,
               Col2
     ) USING (Col1, Col2, Col3_bool)
要为这些行中的每一行获取十行,请与另一个具有十个值的表进行交叉联接:

INSERT INTO Table2
SELECT Table1.Col1,
       Table1.Col2,
       enums.i,
       Table1.Col4
FROM Table1
JOIN (SELECT Col1,
             Col2,
             MAX(Col3_bool) AS Col3_bool
      FROM Table1
      GROUP BY Col1,
               Col2
     ) USING (Col1, Col2, Col3_bool)
JOIN (SELECT 0 AS i UNION ALL
      SELECT 1      UNION ALL
      SELECT 2      UNION ALL
      SELECT 3      UNION ALL
      SELECT 4      UNION ALL
      SELECT 5      UNION ALL
      SELECT 6      UNION ALL
      SELECT 7      UNION ALL
      SELECT 8      UNION ALL
      SELECT 9) AS enums