根据条件将表B中的行添加到表A中

时间:2018-09-09 19:28:12

标签: sql database python-3.x sqlite

我在sqlite中使用python。我有两个数据表,表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中的行。如果一行在B中出现3次而在A中仅发生2次,则不会返回该行的一个实例,这是我需要的突显表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 :(得分:2)

同一列,然后将它们合并到一个结果集中?

此处可以使用UNION ALLEXCEPT之类的声音。

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

db <>小提琴here

上进行测试

但是它有一个缺点,那就是它会导致TableB中出现大量重复行。

如果您将能够使用最终支持窗口功能的Sqlite版本(3.25+)? Reference。然后使用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

test

在旧版本中,可以模仿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

db <>小提琴here

上进行测试

答案 1 :(得分:2)

对于如果在B中而不是在A中出现一行,则根据Shawn的评论将其添加到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)