Добавить строку из таблицы B в таблицу A на основе условий - PullRequest
0 голосов
/ 09 сентября 2018

Я использую Python с SQLite. У меня есть две таблицы данных, таблица A и таблица B. Я хочу объединить строки таблицы B с A при следующих условиях:

  • Если строка находится в B, а не в A, добавьте ее в A.
  • Если в B строка встречается больше, чем в A, добавляйте ее в A, пока она не появится в A так часто, как в B.

Если у меня есть следующие две таблицы

Table A  Table B
2 4 1 3  2 2 2 1
2 2 2 1  2 4 1 3
4 5 2 4  2 4 1 3
1 4 2 5  2 4 1 3
2 4 1 3  5 3 2 3

Я хочу иметь следующую таблицу

Table A + B
  2 2 2 1
  2 4 1 3
  2 4 1 3
  2 4 1 3
  4 5 2 4
  1 4 2 5
  5 3 2 3

Вопрос: Можно ли добиться этого с помощью SQL-запроса? Если так; как?

Редактировать: Хотя ответы оказались очень полезными, они не решают весь вопрос.

SELECT valB1, valB2, valB3, valB4 FROM B
WHERE NOT EXISTS(SELECT valA1, valA2, valA3, valA4
             FROM A
             WHERE A.valA1 = B.valB1
               AND A.valA2 = B.valB2
               AND A.valA3 = B.valB3
               AND A.valA4 = B.valB4)

вернет строки, которые не находятся в A и находятся в B. Если строка встречается 3 раза в B и только 2 раза в A, она не вернет один экземпляр этой строки, что мне и понадобится для того, чтобы увеличить вхождение этой строки в таблицу A.

Запрос

SELECT col1, col2, col3, col4
FROM TableA
EXCEPT
SELECT col1, col2, col3, col4
FROM TableB
UNION ALL
SELECT col1, col2, col3, col4
FROM TableB

не работает, потому что если строка в B меньше, чем в A, я получу количество строк в B, а не A. Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Для Если строка находится в B, а не в A, добавьте ее к A. , основываясь на комментарии Шона:

INSERT INTO A (valA1, valA2, valA3, valA4)
SELECT valB1, valB2, valB3, valB4 FROM B
WHERE NOT EXISTS(SELECT valA1, valA2, valA3, valA4
                 FROM A
                 WHERE A.valA1 = B.valB1
                   AND A.valA2 = B.valB2
                   AND A.valA3 = B.valB3
                   AND A.valA4 = B.valB4)
0 голосов
/ 09 сентября 2018

Те же столбцы, и объединить их в одном наборе результатов?

Похоже, что UNION ALL и EXCEPT могут использоваться здесь.

SELECT col1, col2, col3, col4
FROM TableA
EXCEPT
SELECT col1, col2, col3, col4
FROM TableB
UNION ALL
SELECT col1, col2, col3, col4
FROM TableB

Тест по дБ <> скрипка здесь

Но у него есть тот недостаток, что он приведет к количеству повторяющихся строк, как показано в Таблице B.

А если бы вы могли использовать версию Sqlite (3.25+), которая наконец поддерживает функции окна? Ссылка . Затем с помощью ROW_NUMBER можно решить проблему с «дубликатами TableA> дубликатов TableB»:

SELECT col1, col2, col3, col4
FROM
(
  SELECT col1, col2, col3, col4, 
    row_number() over (partition by col1, col2, col3, col4 order by (select 0)) as rn
  FROM TableA 
  EXCEPT 
  SELECT col1, col2, col3, col4, 
    row_number() over (partition by col1, col2, col3, col4 order by (select 0))
  FROM TableB 
  UNION ALL 
  SELECT col1, col2, col3, col4, 0
  FROM TableB
) q
ORDER BY col1, col2, col3, col4

тест

В старых версиях оконную функцию ROW_NUMBER можно имитировать.

SELECT col1, col2, col3, col4
FROM
(
  SELECT a.col1, a.col2, a.col3, a.col4,
  (select count(*) from TableA a2
   where a2.col1 = a.col1 
     and a2.col2 = a.col2 
     and a2.col3 = a.col3 
     and a2.col4 = a.col4
     and a2.rowid >= a.rowid) as rn
  FROM TableA a
  EXCEPT
  SELECT b.col1, b.col2, b.col3, b.col4,
  (select count(*) from TableB b2
   where b2.col1 = b.col1 
     and b2.col2 = b.col2 
     and b2.col3 = b.col3 
     and b2.col4 = b.col4
     and b2.rowid >= b.rowid)
  FROM TableB b
  UNION ALL
  SELECT col1, col2, col3, col4, 0
  FROM TableB
) q
ORDER BY col1, col2, col3, col4

Тест по дБ <> скрипка здесь

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