4

我需要根据从以下两个表中提取的数据创建一个新表:

第一张表:

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 <当前编号。例如,在上面显示的示例中,对于 A,将有一行包含 10(其 cur_number)和一行包含“2”(因为 2<10,但是 11>10)。

在我的示例中,新表将是:

Var         Number
 A            10
 A            2
 B            8
 B            4
 B            6

数据库非常大,运行时间很关键,所以我不能在两个表上使用 UNION ......

4

4 回答 4

2

此脚本假定 table1 中每个“Var”值只有一条记录。

--从table1中全部插入

insert into newtable (var,number)
select var,cur_number from table1 t1

--insert from table2 where 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
于 2012-11-29T13:05:43.377 回答
1

试试这个:

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);

SQL 小提琴演示

这会将两个表的值合并到第一个表中。第一个表将包含:

VAR    CUR_NUMBER
A          10
B          8
A          2
B          4
B          6

请注意:使用时MERGE

  • 您必须用分号终止MERGE语句,这是强制性的。
  • 你不能INSERT在里面,WHEN MATCHED这就是为什么我>=WHEN NOT MATCHED.
于 2012-11-29T12:38:17.803 回答
1

如果您知道这两个表中没有重复值,那么您可以使用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它比使用. 如果您有重复,这是我的经验中最好的。UNIONUNIONSELECT DISTINCTUNION

于 2012-11-29T12:45:42.230 回答
0

为什么不使用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
于 2012-11-29T12:34:00.790 回答