sqlite3 объединить два поля таблицы в одно, удалить дубликаты - PullRequest
0 голосов
/ 11 октября 2019

У меня есть две таблицы, которые нужно объединить в одну. Таблицы имеют различное количество строк.

table1
      att1     rel1

      1954WM   1699AC, 1847BC


table-2
      att2     rel2

      1954WM   1699AC, 1331, 1649A
      1499DD   1891, 9951A

Выше приведен пример структуры. То, что я хотел бы иметь, если table1.att1 == table-2.att2, то table1 будет выглядеть следующим образом:

table1
      att2     rel2

      1954WM   1699AC, 1847BC, 1331, 1649A
      1499DD   1891, 9951A

, если нет совпадения для table-2.att2 в table1.att1, затем добавьтеtable-2.att2 с rel2 в table1.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Вот оператор SQL без побочных эффектов для вычисления требуемой таблицы:

WITH remnants AS (SELECT * FROM table1 WHERE att1 NOT IN (SELECT att2 FROM table2))
SELECT * FROM (SELECT att1 as att2, rel1 as rel2 FROM remnants)
              UNION SELECT * FROM table2;

Если вы хотите перезаписать table1, вы можете использовать следующее, но, конечно, результат сохранит имена столбцов:

DELETE FROM table1 WHERE att1 IN (SELECT att2 FROM table2);
INSERT INTO table1 SELECT * FROM table2;
0 голосов
/ 11 октября 2019

ЕСЛИ вы не возражаете против дублирования элементов в rel1 (т. Е. Объединение дубликатов относится к столбцам att?) И ЕСЛИ Столбец att1 имеет УНИКАЛЬНОЕ ограничение, то: -

WITH a AS(SELECT att1,rel1 FROM `table1` UNION SELECT att2 AS att1,rel2 AS rel1 FROM `table-2`),
         b AS (SELECT att1,group_concat(rel1) AS rel1 FROM a GROUP BY att1)          
INSERT OR REPLACE INTO `table1` SELECT att1,rel1 FROM b;

приведет к

enter image description here

ЕСЛИ вы не возражаете против повторяющихся элементов в rel1 НО столбец att1 не имеет УНИКАЛЬНОГО ограничения, тогда: -

WITH a AS(SELECT att1,rel1 FROM `table1` UNION SELECT att2 AS att1,rel2 AS rel1 FROM `table-2`),
         b AS (SELECT att1,group_concat(rel1) AS rel1 FROM a GROUP BY att1)          
INSERT INTO `table1` SELECT 'ADDED-'||att1,rel1 FROM b;

DELETE FROM `table1` WHERE instr(att1,'ADDED-') < 1;

UPDATE `table1` SET att1 = substr(att1,instr(att1,'ADDED-') + 1 + length('ADDED')); 

или: -

CREATE UNIQUE INDEX IF NOT EXISTS att1ix ON `table1`(att1);
WITH a AS(SELECT att1,rel1 FROM `table1` UNION SELECT att2 AS att1,rel2 AS rel1 FROM `table-2`),
         b AS (SELECT att1,group_concat(rel1) AS rel1 FROM a GROUP BY att1)
INSERT OR REPLACE INTO `table1` SELECT att1,rel1 FROM b;

даст тот же результат.

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