2013-10-21 62 views
0

這是我目前的情況:比較2個MySQL表和移動新行到第二個表

我有兩個表(TB1 & TB2)是完全一樣的exept的一列。我有一個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 

我知道我錯過了嵌件,但在任何幫助這兩個或至少是選擇將非常感激。

Thanx!

回答

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); 

但我可能失去了一些東西你是後...

+0

謝謝非常多,這工作! –

+0

將SQL視爲管理數據集。外部聯接允許您查看一組中的所有數據,包括具有不同組的交集,或者在這種情況下,不存在交集。一個說明的例子可以找到http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – xQbert

1

隨着TB2超過(col1, col2)定義的唯一密鑰,您可以使用INSERT IGNORE ... SELECT

INSERT IGNORE INTO TB2 (col1, col2, col3) SELECT col1, col2, col3 FROM TB1; 
1

我會做這樣的:用獨特的密鑰eggyal講述

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

,因爲從我記得INSER IGNORE忽略所有插入失敗,這可能是col3不需要的。