gpt4 book ai didi

sql - 如何在 INSERT 中构建 "if-else"SQL 查询?

转载 作者:行者123 更新时间:2023-12-03 19:44:09 25 4
gpt4 key购买 nike

我正在尝试将列从一个 SQLite 表复制到另一个,但用枚举(0 到 9)替换 bool 值(0 或 1)。一个给定的项目可以在表中出现两次 - 每个 bool 设置一次。我想用 true 复制记录 bool 优先,如果不存在,那么我想用 false 复制记录 bool 值。

有没有办法在单个查询中做到这一点?

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

// 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;
}

最佳答案

只要您对所有查询使用单个事务,就不太可能出现任何性能差异。

对于每个 Col1/Col2组合,你想要最大Col3值(value):

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

关于sql - 如何在 INSERT 中构建 "if-else"SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com