我在sqlite中使用python。我有两个数据表,表A和表B。在以下条件下,我想将表B的行与A连接起来:
如果我有以下两个表
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中的行数量。 谢谢!
答案 0 :(得分:2)
同一列,然后将它们合并到一个结果集中?
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
在旧版本中,可以模仿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)