我有两个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
方法(即不使用PHP
,ASP
等)。
我对IF/ELSE
中的SQL
语法很熟悉,但我不确定如何迭代表中的每一行。任何人都可以让我开始朝着正确的方向前进吗?
答案 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;
让我们知道它是否有效,最好的问候。