这是我当前的场景:
我有两个表(TB1 和 TB2),它们与一列完全相同。我有一个 CRON,它可以从远程 SQL 数据库复制所有内容并刷新 TB1 上的所有内容,删除当前行并插入新行,因此 TB1 是我的源表。
在 TB2 上,我的结构与 TB1 完全相同,但最后一行从 true 变为 false,默认值为 false。请参阅下面的示例表:
TB1+---------------+---------------+---------------+---------------+|身份证 |Col1 |Col2 |Col3 |+---------------+---------------+---------------+---------------+|1 |值1 |val-A |false ||2 |值2 |val-B |false ||3 |值1 |val-C |false ||4 |值3 |val-D |false ||5 |值4 |val-E |false |+---------------+---------------+---------------+---------------+瑞银+---------------+---------------+---------------+---------------+|身份证 |Col1 |Col2 |Col3 |+---------------+---------------+---------------+---------------+|1 |值1 |val-A |true ||2 |值2 |val-B |false ||3 |值1 |val-C |true ||4 |值3 |val-D |false |+---------------+---------------+---------------+---------------+
如您所见,TB1 有一个额外的行 id=5。col1 和 col2 的组合都是独一无二的,这就是我试图检测的,因此 TB1.col1 和 TB1.col2 的任何新组合都应复制到 TB2,同时保留 TB2.col3。
我尝试了以下内容,但它在我的情况下并不真正有效,因为它只显示所有不同的值而不是组合差异:
从 (从 TB1 中选择 TB1.col1、TB1.col2全部联盟从 TB2 中选择 TB2.col1、TB2.col2) TB1分组方式 TB1.col1计数 (*) = 1按 TB1.col1 订购
我知道我错过了插入部分,但对两者或至少 SELECT 的任何帮助将不胜感激。
谢谢!
不要认为减号在我的 sql 中可用,但外部连接应该可以工作
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);
但我可能错过了你所追求的东西......
在 (col1, col2)
TB2
中定义唯一键后,您可以使用INSERT IGNORE ... SELECT
:
INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1;
我会这样做:
INSERT INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1 ON DUPLICATE KEY UPDATE col3=col3;
使用Eggyal告诉的唯一键,因为据我所知,INSER忽略忽略所有失败的插入,这可能是Col3不需要的。