这是我目前的情况:
我有两个表(TB1和TB2),它们与一列完全相同。我有一个CRON,它复制远程SQL数据库中的所有内容,并刷新TB1上的所有内容,删除当前行并插入新行,因此TB1是我的源表。
在TB2上,我的结构与TB1完全相同,但最后一行从true变为false,默认为false。请参阅下面的示例表:
TB1 +---------------+---------------+---------------+---------------+ | id | col1 | col2 |col3 | +---------------+---------------+---------------+---------------+ | 1 | value1 | val-A |false | | 2 | value2 | val-B |false | | 3 | value1 | val-C |false | | 4 | value3 | val-D |false | | 5 | value4 | val-E |false | +---------------+---------------+---------------+---------------+ TB2 +---------------+---------------+---------------+---------------+ | id | col1 | col2 |col3 | +---------------+---------------+---------------+---------------+ | 1 | value1 | val-A |true | | 2 | value2 | val-B |false | | 3 | value1 | val-C |true | | 4 | value3 | val-D |false | +---------------+---------------+---------------+---------------+
正如您所看到的,TB1有一个额外的行id = 5。 col1和col2的组合是唯一的,这就是我想要检测的,所以TB1.col1和TB1.col2的任何新组合都应该复制到TB2,同时保留TB2.col3。
我尝试了以下内容,但在我的情况下并没有真正起作用,因为它只显示所有不同的值而不是组合差异:
SELECT TB1.col1, TB1.col2 FROM ( SELECT TB1.col1, TB1.col2 FROM TB1 UNION ALL SELECT TB2.col1, TB2.col2 FROM TB2 ) TB1 GROUP BY TB1.col1 HAVING count(*) = 1 ORDER BY TB1.col1
我知道我错过了INSERT部分,但是对这两者或至少SELECT的任何帮助都将非常感激。
感谢名单!
答案 0 :(得分:1)
使用TB2
在(col1, col2)
之上定义的唯一键,您可以使用INSERT IGNORE ... SELECT
:
INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1;
答案 1 :(得分:1)
我会这样做:
INSERT INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1 ON DUPLICATE KEY UPDATE col3=col3;
使用eggyal告诉的唯一键,因为从我记忆中INSER IGNORE忽略所有失败的插入,这可能是col3不需要的。
答案 2 :(得分:1)
不要认为我的sql中的Minus可用,但外连接应该可以使用
http://sqlfiddle.com/#!2/e73e4/1/0
Insert into tb2 (
Select tb1.ID, tb1.Col1, tb1.Col2, tb1.Col3 from tb1
LEFT JOIN tb2 on Tb1.col1=tb2.col1 and Tb1.col2=tb2.col2
Where tb2.col1 is null);
但我可能会错过你追求的东西......