2012-06-15 18 views
1

我有2個表TEST1和Test1Update用以下結構得到兩個相同的表中的記錄與某些條件

Test1 
id name address 

Test1Update 
id name address 

這裏Test1的是舊錶和Test1Update只是Test1的表 的副本我想用GET記錄此條件下,

if(Test1.id=Test1Update.id){ 

select macthing values from Test1Update tables,and remaining unmatched values from Test1 table 
} 
else if(Test1.id!=Test1Update.id) 
{ 
select * from Test1 only 
} 

作爲示例

測試1具有數據等

Test1 
id name address 
1 john Ca 
2 mary La 

and Test1Update has data like 

id name address 
1 john Las Vega 

小號

現在,我想只有從

Test1 table so final output will be 

id name address 
1 john Las Vegas 
2 mary La 

匹配從Test1Update表中的記錄和所有不匹配的記錄,這意味着,只要有發現任何匹配 舊條目應該replced與Test1Update。

我該如何使用select查詢或過程來做到這一點?

給我一些方法。

+0

事實上你想選擇test1update表的值,除非它們與test1表的值不同? –

+0

闡述更多,update_table是否包含表的所有行以及一些新行? –

+0

我試圖用例子來闡述我的問題 – Java

回答

2

假設在Test1Update所有的ID存在於測試1,可以簡單地這樣做:

SELECT 
    TEST1.ID, 
    COALESCE(TEST1UPDATE.NAME, TEST1.NAME) as NAME, 
    COALESCE(TEST1UPDATE.ADDRESS, TEST1.ADDRESS) as ADDRESS 
FROM TEST1 
LEFT JOIN TEST1UPDATE ON TEST1.ID = TEST1UPDATE.ID 

看到它在這裏工作:http://sqlfiddle.com/#!3/4a1f2/3/0

隨着LEFT JOIN,如果沒有TEST1UPDATE,TEST1UPDATE.NAME和TEST1UPDATE.ADDRESS中的匹配項爲空。 COALESCE爲您提供了第一個非空參數,因此您從TEST1UPDATE得到了值(如果存在),否則從TEST1獲得值。


編輯爲聯盟的解決方案:

如果有很多領域,聚結的解決方案可能是一個有點冗長,你想用一個UNION:

SELECT * 
FROM TEST1UPDATE 
INNER JOIN TEST1 ON TEST1.ID = TEST1UPDATE.ID 

UNION 

SELECT * 
FROM TEST1 
LEFT JOIN TEST1UPDATE ON TEST1.ID = TEST1UPDATE.ID 
WHERE TEST1UPDATE.ID IS NULL; 
+0

是的,但是當你告訴我們是否有很多字段時,COALESCE解決方案可能有點冗長,我想選擇超過40個字段,所以如果我使用union,它會選擇兩個列,如test1.name,test1update.name ,那麼我應該考慮哪個值用於最終顯示?我對嗎? – Java

+0

不,你很快樂,因爲它是解決方案:)第一個SELECT只給出TEST1UPDATE中有TEST1匹配的行,第二個SELET給出TEST1中不在TEST1UPDATE中的行。 UNION將第二個結果集置於第一個結果集之下,但不會得到列的重複項:)在sqlfiddle鏈接中嘗試它:) –

相關問題