2012-01-18 28 views
4

たとえば、私は2つのテーブル(一時テーブル)を持っています。そのうちの1つにはIDのみが含まれ、もう1つには実際の情報が含まれます。彼らはまったく同じ行番号を持っています。条件なしで2つのテーブルを結合する方法

#Table1 
ID 
14 
15 
16 

#Table2 
CarModel Year 
Ford  1996 
Ferrari  2005 
Toyota  2010 

どのように私は(ちょうど、結果テーブルには3列、どのような順序で関係なく持って、任意の条件なし)1で、この2つのテーブルを結合することができますか?実際のテーブルの結果を挿入するために必要です

Cars 
ID CarModel Year 

この表ではIDは使用していません。挿入する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で使用されるかもしれないので、私はソリューションの他の変種を見てうれしいでしょう。

+2

'ROW_NUMBER()'これを実現するための方法のようになります。三角形の

パフォーマンスに関する考慮事項がうまくここで説明されているに参加します。しかし、関連するデータが実際には含まれていない場合、これらの2つのテーブルを結合する必要があるのはなぜですか? – Tejs

+1

CTEと 'ROW_NUMBER'が私にとって最善の方法と思われます。 SQL Server 2000の場合、ID列または三角形結合でカーソルをシミュレートするか、カーソルを使用する必要があります。 –

+0

@Tejsあなたの答えをありがとう。実際の(一時的ではない)表に挿入するには、この結合日付が必要です。そして、挿入された行にストアドプロシージャから取得したIDが必要です。しかし、私は本当に各行にどんな具体的なIDがあるのか​​気にしません。私はすべて彼らが私の "プール"から来る必要がありますはい、それは最高のスキーマではありませんが、それがあり、私はそれを使用する必要があります。 –

答えて

7

はここでそれはマーティン・スミスさんのコメントごとに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/

+0

なぜ複雑な鋳造条件ですか? CarModel

+0

実行計画と統計情報は私の箱で同じです。とにかく、彼のコード基準に合うように変更することは、営業担当者の責任です。 –

+0

小さなテーブルの場合は問題ありません。 –

関連する問題