Как объединить две таблицы без каких-либо условий - PullRequest
4 голосов
/ 18 января 2012

Например, у меня есть две таблицы (временные таблицы).Один из них содержит только идентификаторы, а другой содержит реальную информацию.У них одинаковый номер строки.

#Table1
ID
14
15
16

#Table2
CarModel    Year
Ford        1996
Ferrari     2005
Toyota      2010

Как я могу объединить эти две таблицы в одну (без каких-либо условий, только таблица результатов имеет 3 столбца, независимо от того, в каком порядке)?Мне нужно это для вставки результата для реальной таблицы

Cars
ID   CarModel   Year

И эта таблица не использует идентичность.Существует собственный механизм получения идентификаторов для вставки.Я не могу изменить его.

Так что в результате мне нужна таблица, подобная одной из следующих (порядок не важен):

#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

PS Я понимаю, как это сделать с помощью CTE и row_number (), но я думаю, что есть более простой способ выполнить эту задачу.И, возможно, этот код будет использоваться в MS SQL Server 2000, поэтому я буду рад рассмотреть другие варианты решений.

1 Ответ

7 голосов
/ 18 января 2012

Вот треугольное соединение, которое будет работать в 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/

...