0

这是我目前的情况:

我有两张表(TB1 和 TB2),除了一列之外完全相同。我有一个 CRON,它从远程 SQL 数据库复制所有内容并刷新 TB1 上的所有内容,删除当前行并插入新行,因此 TB1 是我的源表。

在 TB2 上,我的结构与 TB1 完全相同,但最后一行从 true 变为 false,默认为 false。请参阅下面的示例表:

TB1
+---------------+---------------+---------------+- --------------+
| 编号 | col1 | col2 |col3 |
+---------------+---------------+---------------+- --------------+
| 1 | 值1 | val-A |假 |
| 2 | 值2 | val-B |假 |
| 3 | 值1 | val-C |假|
| 4 | 价值3 | val-D |假 |
| 5 | 价值4 | val-E |假 |
+---------------+---------------+---------------+- --------------+



TB2
+---------------+---------------+---------------+- --------------+
| 编号 | col1 | col2 |col3 |
+---------------+---------------+---------------+- --------------+
| 1 | 值1 | val-A |真 |
| 2 | 值2 | val-B |假 |
| 3 | 值1 | val-C |真 |
| 4 | 价值3 | val-D |假 |
+---------------+---------------+---------------+- --------------+

如您所见,TB1 有一个额外的行 id=5。col1 和 col2 的组合是唯一的,这就是我要检测的内容,因此 TB1.col1 和 TB1.col2 的任何新组合都应复制到 TB2,同时保留 TB2.col3。

我尝试了以下方法,但在我的情况下它并没有真正起作用,因为它只显示所有不同的值而不是组合的差异:

从(
从 TB1 中选择 TB1.col1、TB1.col2
联合所有
从 TB2 中选择 TB2.col1、TB2.col2
) TB1
按 T​​B1.col1 分组
有计数(*)= 1
由 TB1.col1 订购

我知道我错过了 INSERT 部分,但对两者或至少 SELECT 的任何帮助将不胜感激。

谢谢!

4

3 回答 3

1

我会这样做:

INSERT INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1 ON DUPLICATE KEY UPDATE col3=col3;

使用 eggyal 讲述的唯一键,因为据我记得 INSER IGNORE 会忽略所有失败的插入,这对于 col3 可能是不需要的。

于 2013-10-21T19:25:29.420 回答
1

TB2使用over中定义的唯一键(col1, col2),您可以使用INSERT IGNORE ... SELECT

INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1;
于 2013-10-21T19:19:20.053 回答
1

不要认为我的 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);

但我可能会错过你想要的东西......

于 2013-10-21T19:29:08.097 回答