例如,我有两个表(临时表)。其中一个只包含ID,另一个包含真实信息。它们的行号完全相同。
#Table1
ID
14
15
16
#Table2
CarModel Year
Ford 1996
Ferrari 2005
Toyota 2010
如何将这两个表合并为一个(没有任何条件,只是结果表有3列,无论以什么顺序)?我需要它来插入真实表的结果
Cars
ID CarModel Year
此表不使用标识。有一种获取ID的方法可以插入。 我无法改变它。
因此,我需要一个像下列其中一个的表(排序并不重要):
#Table3
ID CarModel Year
14 Ford 1996
15 Ferrari 2005
16 Toyota 2010
或
#Table3
ID CarModel Year
16 Ford 1996
14 Toyota 2010
15 Ferrari 2005
P.S。我理解如何使用CTE和row_number(),但我认为有更简单的方法来完成这项任务。可能这个代码将在MS SQL Server 2000中使用,所以我很乐意看看解决方案的其他变体。
答案 0 :(得分:7)
根据Martin Smith的评论,这是一个可以在SQL Server 2000中运行的三角形连接:
-- Some test data:
declare @Table1 table (
ID int primary key
)
insert into @Table1 select 14
insert into @Table1 select 15
insert into @Table1 select 16
declare @Table2 table (
CarModel varchar(50) not null,
[Year] smallint not null
)
insert into @Table2 select 'Ford', 1996
insert into @Table2 select 'Ferrari', 2005
insert into @Table2 select 'Toyota', 2010
-- Here's the actual query:
select Table1.ID, Table2.CarModel, Table2.[Year]
from (
select ID, (select count(*) from @Table1 where ID < a.ID) as JoinPredicate
from @Table1 as a
) as Table1
join (
select CarModel, [Year], (select count(*) from @Table2 where CarModel < a.CarModel or (CarModel = a.CarModel and [Year] < a.[Year])) as JoinPredicate
from @Table2 as a
) as Table2 on Table1.JoinPredicate = Table2.JoinPredicate
当然,这假设Table1.ID是唯一的,Table2.CarModel + Table2.Year是唯一的。
这里很好地讨论了三角形连接的性能考虑因素:http://www.sqlservercentral.com/articles/T-SQL/61539/