我有两个表格:
----------
Items | QTY
----------
sugar | 14
mango | 10
apple | 50
berry | 1
----------
Items |QTY
----------
sugar |10
mango |5
apple |48
berry |1
我使用python中的以下查询检查表1和表2的数量之间的差异
cur = conn.cursor()
cur.execute("select s.Items, s.qty - t.qty as quantity from Stock s join Second_table t on s.Items = t.Items;")
remaining_quantity = cur.fetchall()
我有点纠结于如何去做我需要完成的事情。我需要检查表1和表2的数量之间的差异,如果数量(差异)小于5,那么对于那些项目,我希望能够将其存储在另一个表列中,值为1,如果不是,那么这些项目的值将为0。我该怎么办
编辑:
我尝试过这样做,通过循环行,如果列值小于5,则使用以下值插入到新表中:
for row in remaining_quantity:
print(row[1])
if((row[1]) < 5):
cur.execute('INSERT OR IGNORE INTO check_quantity_tb VALUES (select distinct s.Items, s.qty, s.qty - t.qty as quantity, 1 from Stock s join Second_table t on s.Items = t.Items'), row)
print(row)
但是我得到一个SQL语法错误,不确定错误可能在哪里:/
首先修改第一个查询,以便检索所有相关信息,而不必在以后发出子查询:
然后使用它更新第三个表:
注意以下几点:
1/我们使用两个不同的游标,这样我们可以在第一个游标上迭代,同时使用第二个游标写入。这避免了在内存中获取所有结果,这对于大型数据集来说是一个真正的节约
2/当在第一个游标上迭代时,我们将行解压为各自的组成部分。这称为“元组解包”(但实际上适用于大多数序列类型):
3/我们让db api模块对要插入的值进行适当的清除和转义。这避免了转义/引用等带来的麻烦,并保护您的代码免受SQL注入攻击(这里可能没有,但这是用Python编写参数化查询的正确方法)
注意:由于您没有发布完整的表定义或明确的规范,甚至没有完整的错误消息和回溯,因此我只将您的代码片段翻译成更合理的内容(避免使用代价高昂且无用的子查询,因为它可能是导致错误的原因)。我不能保证它会开箱即用,但至少它会让你回到正轨
NB2:您提到必须根据
remain
值将最后一列设置为1或0。如果是这种情况,您希望您的循环是:如果您只想处理保留的行<;5,您可以在第一个查询中使用where子句直接指定它
相关问题 更多 >
编程相关推荐