SQL:在新表中没有该日期的数据时,从一个表添加多行到另一个表

时间:2015-03-01 07:21:05

标签: sql sql-server sql-server-2012

我尝试在从一个系统切换到另一个系统后将医疗数据从一个表更新到另一个表。我们有两个表,为简单起见,我将这个简单的例子。实际上这些表中有许多列(不仅仅是5个)。

表1

name, date, var1, var2, var3

表2

name, date, var1a, var2a, var3a

我想将表1中的数据传输到表2,以查找该日期之前没有数据的行,其中var1 = var1a等(具有不同名称的相同列)。

我试图用循环做某事,但意识到可能没有必要。

我已经做到这一点,但保持不确定这是否可以:

UPDATE Table2 VALUES (date, var1a, var2a, var3a)
SELECT date, var1, var2, var3 FROM Table1

到目前为止,这是正确的语法吗?或者我是否需要映射变量以将var1转换为var1a等?

如何添加支票以确保我不会覆盖Table1中已有的任何数据?如果已存在该日期/名称组合的数据,我不想添加数据。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用update with a join。而且您不需要更新date column,因为您正在使用它来查找2个表中的匹配项。

您可以基于空/空值列生成动态查询,或者您可以执行类似下面的操作,如果table2中存在相同的值,则会在列中放置相同的值,或者输出相应的值来自table1。 下面的方法需要更少的逻辑并且更容易实现,但会产生相当于更新整个表的IO。

update tbl2
set val1a=isnull(val1a,val1)
, val2a=isnull(val2a,val2)
, val3a=isnull(val3a.val3)
from table1 tbl1
inner join table2 tbl2 
on tbl1.name=tbl2.name
and tbl1.date=tbl2.date

考虑:

该方法需要较少的逻辑并且更容易实现,但会产生相当于更新整个表2的IO。如果你有一张小桌子,我会采用这种方法。

如果它是一个大表,那么你应该研究构建特定的查询集来减少IO

答案 1 :(得分:0)

此代码在Access中进行了测试,但非常相似的内容应该在SQL Server 2012中有效:

UPDATE Table2 RIGHT JOIN Table1 ON Table2.date = Table1.date 
SET Table2.name = Table1.name, Table2.date = Table1.date, Table2.var1 = Table1.var1a, Table2.var2 = Table1.var2a, Table2.var3 = Table1.var3a
WHERE (Table2.date Is Null);

说明:这使用右连接,以便在查询中存在Table1中的所有数据,并且Table2的匹配日期也存在数据。然后,我们忽略表2中存在任何数据的所有情况,并在所有其他情况下更新查询 - 事实上,更新将新数据插入到表2中。

答案 2 :(得分:0)

您可INSERT TABLE2 TABLE1 Table2 INSERT INTO Table2 (date, var1a, var2a, var3a) SELECT date, var1, var2, var3 FROM Table1 t1 WHERE NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.date = t1.date) date中尚未存在的所有值:

SELECT

通过比较NOT EXISTS列来指定现有值。您可以在{{1}}表达式的{{1}}子查询中添加任何其他谓词,以满足您的需求。