给出两个表:
create table table_A (col1 int, col2 int);
insert into table_A values(10,10);
insert into table_A values(15,15);
insert into table_A values(35,35);
insert into table_A values(45,45);
create table table_B (col1 int, col2 int);
insert into table_B values(10,10);
insert into table_B values(2000,2000);
insert into table_B values(35,35);
insert into table_B values(6000,6000);
我想将table_B中每一行的内容复制到table_A中,除非这些行重复。应用LEFT JOIN后的正确输出为:
select * from table_A;
+------+------+
| col1 | col2 |
+------+------+
| 10 | 10 |
| 15 | 15 |
| 35 | 35 |
| 45 | 45 |
| 2000 | 2000 |
| 6000 | 6000 |
+------+------+
select * from table_B;
+------+------+
| col1 | col2 |
+------+------+
| 10 | 10 |
| 2000 | 2000 |
| 35 | 35 |
| 6000 | 6000 |
+------+------+
我使用的查询是:
INSERT IGNORE INTO test_leftjoin.table_A (
SELECT DISTINCT test_leftjoin.table_B.*
from test_leftjoin.table_B
LEFT JOIN test_leftjoin.table_A
ON (
test_leftjoin.table_B.col1 = test_leftjoin.table_A.col1 and
test_leftjoin.table_B.col2 = test_leftjoin.table_A.col2
)
WHERE (
test_leftjoin.table_A.col1 IS NULL AND
test_leftjoin.table_A.col2 IS NULL
)
);
这很简单,因为表中只有两列,但如果我必须为20-30列的表编写相同的查询,它就会变得非常复杂和庞大。
除了在这里使用JOIN或简化ON和WHERE匹配以包含所有列之外,还有其他选择吗?
先谢了。
2条答案
按热度按时间zd287kbt1#
当您使用MariaDB 10.6.11时,您可以使用10.3中添加的EXCEPT clause:
对于示例数据,
SELECT * FROM table_A;
返回:| col1| col2|
| --|--|
| 10 | 10 |
| 15 | 15 |
| 35 | 35 |
| 45 | 45 |
| 2000 | 2000 |
| 6000 | 6000 |
这里有一个db<>fiddle。
dffbzjpn2#
如果你使用的版本不支持EXCEPT子句,我想使用相关子查询代替JOIN可以使代码更简洁:
注意:如果没有
distinct
关键字,如果表b有重复的行,则可能发生重复插入。