SQL将缺失的数据从一个表复制到另一个表

时间:2015-07-23 12:41:36

标签: sql

我有两个SQL表,结构相同。第一列是名为'opt'的唯一索引,第二列名为'val'。

在table1中填充了默认值,例如:

 opt    val
 path  /tmp
 file  myfile.txt
 day   tuesday
 time  11:00

第二个表table2将包含相同的行,但某些val列值可能会丢失,例如:

 opt    val
 path  /var/tmp
 file  
 day   
 time  16:30

我想通过table2中的每一行并说'val列中是否有值?如果没有,从table1获取val并更新table2,因此表2将最终为:

 opt    val
 path  /var/tmp
 file  myfile.txt
 day   tuesday
 time  16:30

即填写table1中缺少的数据。

我正在寻找纯粹的SQL方法(即不使用PHPASP等)。

我对IF/ELSE中的SQL语法很熟悉,但我不确定如何迭代表中的每一行。任何人都可以让我开始朝着正确的方向前进吗?

2 个答案:

答案 0 :(得分:1)

您需要的是运行类似于以下内容的更新:

SQL Server:

UPDATE T2
SET T2.val = T1.val
    , T2.opt = T1.opt
FROM Table2 T2 
    LEFT JOIN Table1 T1
        ON T2.opt = T1.opt
            OR T2.val = T1.val
WHERE T2.opt IS NULL
    OR T2.val IS NULL

<强> MySQL的:

UPDATE Table2 T2
  JOIN Table1 T1 ON T2.opt = T1.opt
    OR T2.val = T1.val
SET T2.val = T1.val
  , T2.opt = T1.opt
WHERE T2.VAL IS NULL
  OR T2.OPT IS NULL;

请查看下面的SQLFiddles,了解它对您的数据有何作用。

发布上述查询的变体,以查看NULL中的table2值。看here

要更新这些值,只需运行上面的UPDATE查询即可修改表格中的数据。

查看this SQLFiddle,了解UPDATE的结果。它是上面提到的变体之一,将从table2返回修改后的数据。

答案 1 :(得分:0)

您正在寻找sql cursor。您可以查看一些在线教程以了解将来的需求,但这是一个示例。

DECLARE
   c_opt table2.opt%type; //variable to be used for selecting into 
   c_name table2.val%type; // variable to be used for selecting into 
   CURSOR c_table2 is     // the actual cursor 
      SELECT opt,val FROM table2;
BEGIN
   OPEN c_customers;
   LOOP
      FETCH c_table2 into c_opt, c_val ;
      EXIT WHEN c_customers%notfound;
      IF (c_val is null) THEN UPDATE table 2 set val = (Select val from table 1 where opt = c_opt);
   END LOOP;
   CLOSE c_customers;
END;

让我们知道它是否有效,最好的问候。