Dmi*_*kov 4 sql sql-server join sql-server-2000
例如,我有两个表(临时表).其中一个只包含ID,另一个包含真实信息.它们具有完全相同的行号.
#Table1
ID
14
15
16
#Table2
CarModel Year
Ford 1996
Ferrari 2005
Toyota 2010
Run Code Online (Sandbox Code Playgroud)
如何将这两个表合并为一个(没有任何条件,只有结果表有3列,无论以什么顺序)?我需要它来插入真实表的结果
Cars
ID CarModel Year
Run Code Online (Sandbox Code Playgroud)
并且此表不使用标识.有一种获取ID的方法可以插入.我无法改变它.
因此,我需要一个像下列其中一个的表(排序并不重要):
#Table3
ID CarModel Year
14 Ford 1996
15 Ferrari 2005
16 Toyota 2010
Run Code Online (Sandbox Code Playgroud)
要么
#Table3
ID CarModel Year
16 Ford 1996
14 Toyota 2010
15 Ferrari 2005
Run Code Online (Sandbox Code Playgroud)
PS我理解如何使用CTE和row_number(),但我认为有更简单的方法来完成这项任务.并且可能此代码将用于MS SQL Server 2000,因此我很乐意查看其他解决方案的变体.
根据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
Run Code Online (Sandbox Code Playgroud)
当然,这假设Table1.ID是唯一的,Table2.CarModel + Table2.Year是唯一的.
这里很好地讨论了三角形连接的性能考虑因素:http://www.sqlservercentral.com/articles/T-SQL/61539/
| 归档时间: |
|
| 查看次数: |
10540 次 |
| 最近记录: |