2016-10-04 184 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]