Как объединить две таблицы в БД SQLite, используя Python? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть две таблицы:

1) Таблица A со столбцами: id, c2, c3

2) Таблица B со столбцами: pid, c2

Я хочучтобы объединить их так, чтобы при A.id = B.pid объединить столбцы c2 и c3 из A с соответствующей строкой в ​​таблице B.

pid может встречаться несколько раз в таблице B, но id встречается только один раз.в таблице A.

Я видел другие решения и пробовал это:

    cursor.execute("""SELECT A.c2, A.c3, B.c2 
           FROM A
           INNER JOIN B 
           ON A.id=B.pid""")       

    conn.commit()

Код успешно выполнен, но в таблицах не было отражено никаких изменений.

Я могу предоставить фактическоеданные таблиц и столбцов, если требуется.

ОБНОВЛЕНИЕ

Я понял, что SELECT будет только выбирать, а не обновлять данные в таблице B, но я все еще непонять, как закодировать проблему.

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Вы можете запустить следующее в консоли sqlite3 (или из python), чтобы скопировать то, что вы делаете:

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;

id уникально только в table_a, pid in table_b внешних ключей это.В sqlite есть встроенный уникальный столбец rowid для каждой таблицы, поэтому нам не нужно поле id в table_a, но давайте придерживаться этого примера.

Выуверен pid не уникален и может встречаться несколько раз?Это путает цель обновления table_a со значениями от table_b - в приведенном выше примере вы захотите обновить строку с идентификатором 1 в table_a с новым значением c2, равным 4 или * 1020.*?Или вы пытаетесь сделать что-то еще?

Если pid уникально в table_b, то вы можете использовать только table_a и insert or replace вместо обновления из второй таблицы.

0 голосов
/ 10 июня 2018

В вашем комментарии есть двусмысленность: «Я хочу сопоставить id и pid, как описано выше, а затем добавить соответствующие значения строк c2 и c3 из таблицы A в таблицу B.»Существует (как минимум) две возможности: 1) Таблица B содержит дополнительный столбец c3 или 2) значение c3 из таблицы A следует поместить в столбец c2 таблицы B. Ниже приведен пример кода для каждой из этих двух альтернатив.

Таблица B имеет столбец c3

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)
    ;

Вторая часть предложения объединения гарантирует, что данные из таблицы A не дублируют данные, уже находящиеся в таблице B.

Значения A.c3 должны быть добавлены как B.c2

a) Поскольку два разных столбца таблицы A должны быть вставлены в один и тот же столбец таблицы B, простой способ сделать это с помощью двухотдельные запросы.

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) Если важно сделать это в одном запросе, столбцы c2 и c3 таблицы A можно объединить перед вставкой в ​​таблицу B.

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
    ;
0 голосов
/ 10 июня 2018

Проблема в том, что вы делаете SELECT, который собирает нужные вам данные из имеющихся у вас таблиц.Таким образом, в вашем случае вы получаете данные из таблиц, объединяете их и можете просмотреть результаты объединения, но никаких изменений не произойдет.Вам нужно либо использовать UPDATE, либо INSERT, чтобы повлиять на ваши таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...