如何无条件地连接两个表

时间:2012-01-18 19:29:10

标签: sql sql-server join sql-server-2000

例如,我有两个表(临时表)。其中一个只包含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中使用,所以我很乐意看看解决方案的其他变体。

1 个答案:

答案 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/