首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Python语言连接SQLite数据库中的两个表?

如何使用Python语言连接SQLite数据库中的两个表?
EN

Stack Overflow用户
提问于 2018-06-10 20:33:26
回答 3查看 4.7K关注 0票数 1

我有两张表:

1)表A,列: id、c2、c3

2)表B,列: pid、c2

我希望将它们连接起来,以便对于A.id=B.pid,将A中的列c2和c3与表B中的匹配行连接起来。

pid可以在表B中出现多次,但id在表A中只出现一次。

我看到了其他解决方案,并尝试了以下方法:

代码语言:javascript
复制
    cursor.execute("""SELECT A.c2, A.c3, B.c2 
           FROM A
           INNER JOIN B 
           ON A.id=B.pid""")       

    conn.commit()

代码已成功执行,但表中未反映任何更改。

如果需要,我可以提供表和列的实际数据。

更新

我知道SELECT只会选择而不会更新表B中的数据,但我仍然不知道如何对问题进行编码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-11 02:31:26

您的注释“我希望如上所述匹配id和pid,然后将表A中匹配的c2 & c3行值添加到表B中。”(至少)有两种可能: 1)表B包含额外的列c3,或者2)表A中的c3的值应该放在表B的列c2中。下面是这两种选择中每一种的示例代码。

表B有一个c3列

代码语言:javascript
复制
insert into B
    (pid, c2, c3)
select
    A.id,
    A.c2,
    A.c3
from
    A
    inner join B on A.id = B.pid 
       and (A.c2 != B.c2 or A.c3 != B.c3)
    ;

join子句的第二部分确保表A中的数据不会与表B中已有的任何数据重复。

A.c3的值将作为B.c2添加

a)因为表A的两个不同列将被插入到表B的同一列中,所以这样做的一种简单方法是使用两个单独的查询。

代码语言:javascript
复制
insert into B
    (pid, c2)
select
    A.id,
    A.c2
from
    A
    inner join B on A.id = B.pid and A.c2 != B.c2
    ;

insert into B
    (pid, c2)
select
    A.id,
    A.c3
from
    A
    inner join B on A.id = B.pid and A.c3 != B.c2
    ;

b)如果在单个查询中执行此操作很重要,则可以在将表A插入到表B之前组合表A的c2和c3列。

代码语言:javascript
复制
insert into B
    (pid, c2)
select
    A2.id,
    A2.c2
from
    (select id, c2 from A union select id, c3 as c2 from A) as A2
    inner join B on A2.id = B.pid and A2.c2 != B.c2
    ;
票数 1
EN

Stack Overflow用户

发布于 2018-06-10 23:07:09

问题是您正在执行SELECT,它从您拥有的表中收集您想要的数据。因此,在您的示例中,您可以从表中获取数据,连接它们,并可以查看连接的结果,但不会发生任何更改。您需要使用UPDATE或INSERT来影响已有的表。

票数 3
EN

Stack Overflow用户

发布于 2018-06-11 02:09:46

您可以在sqlite3控制台(或从python)中运行以下命令来复制您正在执行的操作:

代码语言:javascript
复制
create table a_table (
  id int primary key not null,
  c2 int not null,
  c3 int not null
);

create table b_table (
  pid int not null references a_table,
  c2 int not null
);

insert into a_table values (1, 2, 3);
insert into b_table values (1, 4);
insert into b_table values (1, 5);

select a.c2, a.c3, b.c2 from a_table a inner join b_table b on a.id=b.pid;

drop table a_table;
drop table b_table;

idtable_a中是唯一的,pidtable_b外键中是唯一的。对于每个表,sqlite都有一个内置的惟一rowid列,因此我们实际上不需要table_a中的id字段,但让我们将其保留为您的示例。

您确定pid不是唯一的,可能会多次出现吗?这混淆了使用table_b中的值更新table_a的目标-在上面的示例中,您希望使用新的c245来更新table_a中id为1的行吗?或者你正在尝试做其他的事情?

如果pidtable_b中是唯一的,那么您可能只将table_ainsert or replace放入其中,而不是从第二个表进行更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50783729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档