SQL:当新 table 中没有该日期的数据时,将多行从一个 table 添加到另一行
SQL: Add multiple rows from one table to another when no data for that date in new table
我试图在从一个系统切换到另一个系统后将医疗数据从一个 table 更新到另一个。我们有两个 table,为了简单起见,我将把它作为一个简单的例子。实际上这些 table 中有很多列(不只是 5 个)。
Table1:
name, date, var1, var2, var3
Table2:
name, date, var1a, var2a, var3a
我想将数据从 Table 1 传输到 Table 2,对于没有该日期以前数据的任何行,其中 var1 = var1a 等(相同的列具有不同的名称).
我试图用循环做一些事情,但意识到这可能没有必要。
我已经走到这一步了,但 keep 不确定这是否可行:
UPDATE Table2 VALUES (date, var1a, var2a, var3a)
SELECT date, var1, var2, var3 FROM Table1
到目前为止,语法是否正确?或者我是否需要映射变量以将 var1 转换为 var1a 等?
如何添加检查以确保我不会覆盖 Table1 中已有的任何数据?如果该 date/name 组合已有数据,我不想添加数据。
谢谢!
您可以使用 update with a join
。而且您不需要更新 date column
因为这是您用来在 2 table 中查找匹配项的内容。
您可以根据 empty/null 值列生成动态查询,或者您可以执行类似下面的操作,如果它存在于 table2
中,则将相同的值放入列中,否则从 table1
中输入相应的值。
下面的方法需要更少的逻辑并且更容易实现,但会产生相当于更新整个 table.
的 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
注意事项:
该方法需要较少的逻辑且更易于实施,但会产生 IOs 等同于更新整个 table2。如果你有一个小 table 我会采用这种方法。
如果它很大 table 那么您应该考虑构建特定的查询集以减少 IO
此代码已在 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);
解释:这使用了右连接,因此在查询中,表 1 中的所有数据都存在,并且表 2 中存在匹配日期的数据也存在。然后我们忽略 Table2 有任何数据的所有情况,并在所有其他情况下更新查询——更新实际上是将新数据插入 Table2。
您可以 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
列已指定现有值。您可以在 NOT EXISTS
表达式的 SELECT
子查询中添加任何其他谓词以满足您的需要。
我试图在从一个系统切换到另一个系统后将医疗数据从一个 table 更新到另一个。我们有两个 table,为了简单起见,我将把它作为一个简单的例子。实际上这些 table 中有很多列(不只是 5 个)。
Table1:
name, date, var1, var2, var3
Table2:
name, date, var1a, var2a, var3a
我想将数据从 Table 1 传输到 Table 2,对于没有该日期以前数据的任何行,其中 var1 = var1a 等(相同的列具有不同的名称).
我试图用循环做一些事情,但意识到这可能没有必要。
我已经走到这一步了,但 keep 不确定这是否可行:
UPDATE Table2 VALUES (date, var1a, var2a, var3a)
SELECT date, var1, var2, var3 FROM Table1
到目前为止,语法是否正确?或者我是否需要映射变量以将 var1 转换为 var1a 等?
如何添加检查以确保我不会覆盖 Table1 中已有的任何数据?如果该 date/name 组合已有数据,我不想添加数据。
谢谢!
您可以使用 update with a join
。而且您不需要更新 date column
因为这是您用来在 2 table 中查找匹配项的内容。
您可以根据 empty/null 值列生成动态查询,或者您可以执行类似下面的操作,如果它存在于 table2
中,则将相同的值放入列中,否则从 table1
中输入相应的值。
下面的方法需要更少的逻辑并且更容易实现,但会产生相当于更新整个 table.
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
注意事项:
该方法需要较少的逻辑且更易于实施,但会产生 IOs 等同于更新整个 table2。如果你有一个小 table 我会采用这种方法。
如果它很大 table 那么您应该考虑构建特定的查询集以减少 IO
此代码已在 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);
解释:这使用了右连接,因此在查询中,表 1 中的所有数据都存在,并且表 2 中存在匹配日期的数据也存在。然后我们忽略 Table2 有任何数据的所有情况,并在所有其他情况下更新查询——更新实际上是将新数据插入 Table2。
您可以 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
列已指定现有值。您可以在 NOT EXISTS
表达式的 SELECT
子查询中添加任何其他谓词以满足您的需要。