Как я могу объединить все таблицы в базе данных sqlite3 в одну, но только с уникальным содержимым?(Исключая те же данные строки) - PullRequest
0 голосов
/ 07 мая 2019

Для примера у меня есть 4 таблицы, и в таблице 1 есть строка с теми же данными, что и строка в таблице 2. В таблице 3 есть строка, которая выглядит так же, как строка в таблице 4. Мне нужно все они в одной таблице (не имеет значения, находится ли она в одной базе данных или нет), но исключая повторяющиеся строки.

У них всех одинаковое нет. столбцов и одинаковых имен столбцов.

Пожалуйста, помогите мне создать функцию, потому что я пробовал UNION, но она просто не работает, я тоже пробовал UNIQUE, и она тоже не работает.

Это моя функция, которая включает в себя УНИКАЛЬНЫЙ:

def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS ring(members INTEGER,distance REAL,UNIQUE(members, distance))')

всегда выдает ошибку. Но, пожалуйста, не зацикливайтесь на моем примере кода, я ищу лучшие способы.

Большое спасибо.

1 Ответ

0 голосов
/ 07 мая 2019

Я полагаю, что следующее будет работать так, как вы хотите (имена таблиц должны будут измениться, возможно, будут использоваться имена таблиц с пояснениями): -

WITH RECURSIVE all4 AS(
SELECT * FROM 
    ring1
    UNION SELECT * FROM ring2 UNION SELECT * FROM ring3 UNION SELECT * FROM ring4
)
INSERT OR IGNORE INTO newring SELECT * FROM all4 
;
SELECT * FROM newring;

Следующее демонстрирует вышесказанное: -

DROP TABLE If EXISTS ring1;
DROP TABLE If EXISTS ring2;
DROP TABLE If EXISTS ring3;
DROP TABLE If EXISTS ring4;
DROP TABLE IF EXISTS newring;
CREATE TABLE IF NOT EXISTS ring1(othercolumn TEXT,members INTEGER,distance REAL);
CREATE TABLE IF NOT EXISTS ring2(othercolumn TEXT,members INTEGER,distance REAL);
CREATE TABLE IF NOT EXISTS ring3(othercolumn TEXT,members INTEGER,distance REAL);
CREATE TABLE IF NOT EXISTS ring4(othercolumn TEXT,members INTEGER,distance REAL);
CREATE TABLE IF NOT EXISTS newring(othercolumn TEXT,members INTEGER,distance REAL, UNIQUE(members,distance));
INSERT INTO ring1 VALUES
    ('A',10,30.5),('B',11,30.6),('C',12,30.7),('D',13,30.8), -- duplicates not the othercolumn though
    ('X',100,15.0),('Y',110,17.0),('Z',120,19.0)
;
INSERT INTO ring2 VALUES
    ('E',10,30.5),('F',11,30.6),('G',12,30.7),('H',13,30.8), -- duplicates not the othercolumn though
    ('X',200,15.0),('Y',210,17.0),('Z',220,19.0)
;
INSERT INTO ring3 VALUES
    ('I',10,30.5),('J',11,30.6),('K',12,30.7),('L',13,30.8), -- duplicates not the othercolumn though
    ('X',300,15.0),('Y',310,17.0),('Z',320,19.0)
;
INSERT INTO ring4 VALUES
    ('M',10,30.5),('N',11,30.6),('O',12,30.7),('P',13,30.8), -- duplicates not the othercolumn though
    ('X',400,15.0),('Y',410,17.0),('Z',420,19.0)
;
WITH RECURSIVE all4 AS(
SELECT * FROM 
    ring1
    UNION SELECT * FROM ring2 UNION SELECT * FROM ring3 UNION SELECT * FROM ring4
)
SELECT * FROM all4 
;
WITH RECURSIVE all4 AS(
SELECT * FROM 
    ring1
    UNION SELECT * FROM ring2 UNION SELECT * FROM ring3 UNION SELECT * FROM ring4
)
INSERT OR IGNORE INTO newring SELECT * FROM all4 
;
SELECT * FROM newring;

Результат: -

enter image description here

То есть из 28 строк 16 были добавлены.

16, поскольку каждая из четырех базовых таблиц имеет 3 уникальных строки (т.е. 12 строк), каждая таблица имеет 4 строки, которые имеют одинаковую комбинацию член / расстояние.

Таким образом, только 4 из этих 16 будут добавлены из-за ограничения UNIQUE и INSERT OR IGNORE, и, следовательно, всего будет добавлено 16 строк.

Промежуточный запрос, т. Е. UNION из 4Таблица производит 28 строк в соответствии с: -

enter image description here

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