2016-10-04 227 views
1

我有一個表old_data和一個表new_data。我想寫一個select語句,讓我在OLD_DATA呆在那裏選擇sql查詢合併結果

  1. 在NEW_DATA新行被添加到OLD_DATA
  2. 唯一密鑰id所以在new_dataid行要更新現有的old_data

我需要編寫一個select語句,它會給我old_data更新新的數據和新的數據添加到它。

例子:

表一:

id   count 

1    2 
2   19 
3    4 

表B:

id   count 

2   22 
5    7 

我需要一個SELECT語句,讓我

id   count 

1    2 
2   22 
3    4 
5    7 
+1

您正在使用哪個'RDBMS'。 MERGE'用於此目的 –

+0

我不想使用db特定結構。像加入這樣的事情是我需要的 – gags

回答

2

根據您想要的結果:

 SELECT 
      * 
     FROM 
      [TableB] AS B 
     UNION ALL 
     SELECT 
      * 
     FROM 
      [TableA] AS A 
     WHERE 
      A.id NOT IN (SELECT id FROM [TableB]) 
+0

哦,不,不。這不是最大的事情。剛剛從新表更新的數據給定的ID – gags

+0

@ gags好了,改變了答案,看到這個。 –

+0

這個查詢會給我一切從表B不是在表A中。看着這個例子,它將永遠不會更新第2行的計數值22而不是19 – gags

2

,我認爲這將與COALESCE工作得整整齊齊:

SELECT a.id, COALESCE(b.count, a.count) 
FROM a 
FULL OUTER JOIN b 
ON a.id = b.id 

注意 - 如果您的RDBMS不包含COALESCE,您可以使用CASE如下寫出來的功能:

SELECT a.id, 
CASE WHEN b.count IS NULL THEN a.count 
ELSE b.count END AS count 
FROM ... 

你可以寫一個FULL OUTER JOIN如下:

SELECT * 
FROM a 
LEFT JOIN b 
ON a.id = b.id 
UNION ALL 
SELECT * 
FROM b 
LEFT a 
ON b.id = a.id 
+1

它應該是'全外連接' –

+0

你是對的@Prdp。謝謝! – kbball

+0

但是'Mysql'不支持它.OP想讓代碼在所有sql語言中工作 –

0

必須使用UPSERT更新舊數據並在Old_data表中添加新數據,並從Old_data中選擇所有行。請檢查以下內容並讓我知道您對此查詢的看法

UPDATE [old_data] 
SET [count] = B.[count] 
FROM [old_data] AS A 
INNER JOIN [new_Data] AS B 
ON A.[id] = B.[id] 

INSERT INTO [old_data] 
      ([id] 
      ,[count]) 
SELECT A.[id] 
    ,A.[count] 
FROM [new_Data] AS A 
LEFT JOIN [old_data] AS B 
ON A.[id] = B.[id]  
WHERE B.[id] IS NULL 

SELECT * 
FROM [old_data]