[英]updating a table with a column from another table in SQL
我需要从以下两个表中提取的数据创建一个新表:
第一张表:
Var cur_number
-------------------
A 10
B 8
第二表:
Var new_number
-------------------
A 2
A 11
B 4
B 6
新表应包含一个'Var'列和一个'Number'列,其中每个变量将有一行包含其cur_number,其余行将包含第二个表的new_number列中的数字,其中new_number < cur_number。 例如,在上面所示的例子中,对于A,将有一行10(其cur_number)和一行'2'(因为2 <10,然而11> 10)。
在我的例子中,新表将是:
Var Number
A 10
A 2
B 8
B 4
B 6
数据库非常大,运行时间至关重要,所以我不能在两个表上使用UNION ......
此脚本假定table1中每个“Var”值只有一条记录。
- 从table1插入所有内容
insert into newtable (var,number)
select var,cur_number from table1 t1
- 从table2插入new_number <cur_number
insert into newtable (var,number)
select t2.var, t2.new_number
from table2 t2
inner join table1 t1 on t1.var = t2.var and t2.new_number < t1.cur_number
试试这个:
SELECT var, cur_number FROM FirstTable UNION SELECT t2.var, t2.new_number FROM Firsttable t1 INNER JOIN SecondTable t2 ON t2.new_number < t1.cur_number;
更新:如果您使用的是SQL Server 2008或更高版本,则可以使用MERGE
将两个表合并为一个,如下所示:
MERGE INTO FirstTable AS TGT
USING SecondTable AS SRC
ON SRC.new_number >= TGT.cur_number
WHEN NOT MATCHED THEN
INSERT (var, cur_number)
VALUES (SRC.var, SRC.new_number);
这会将两个表值合并到第一个表中。 第一个表格将包含:
VAR CUR_NUMBER
A 10
B 8
A 2
B 4
B 6
注意:使用MERGE
:
MERGE
语句,这是必需的。 WHEN MATCHED
里面INSERT
这就是为什么我在WHEN NOT MATCHED
使用了反向条件>=
。 如果您知道这两个表中没有重复值的事实,则可以使用UNION ALL
而不是UNION
select * from table1 t1
UNION ALL
select* from table2 t2
where t2.new_number < t1.cur_number
通过重复值,我的意思是这样的:
table1:
var cur_number
A 8
table2:
var new_number
A 8
不同之处在于UNION ALL
比UNION
快,因为UNION
通过使用SELECT DISTINCT
消除了结果集中的重复项。 在你有重复的情况下, UNION
是我经验中最好的。
为什么不使用Union
? * SQLFIDDLE
select * from first
union
select s.var,s.new_number from second s
join first f
on s.var = f.var
join (
select f.var, max(f.cur_number) maxn
from first f
group by f.var) as t
on t.var = s.var
where s.new_number < t.maxn
order by var asc
;
结果
VAR CUR_NUMBER
A 10
B 8
A 2
B 4
B 6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.