Comment joindre deux tables, sans aucune condition

Par exemple, j'ai deux tables (tables temporaires). L'un d'eux ne contient que des pièces D'identité, et l'autre contient des informations réelles. Ils ont exactement le même numéro de ligne.

#Table1
ID
14
15
16

#Table2
CarModel    Year
Ford        1996
Ferrari     2005
Toyota      2010

Comment puis-je joindre ces deux tables en une seule (sans aucune condition, juste la table de résultat a 3 colonnes, peu importe dans quel ordre)? J'en ai besoin pour insérer le résultat pour la table réelle

Cars
ID   CarModel   Year

et cette table n'utilise pas l'identité. Il existe un mécanisme de obtenir des Identifiants pour l'insertion. Je ne suis pas en mesure de le changer.

donc j'ai besoin d'une table comme l'une des suivantes (l'ordre n'est pas important):

#Table3
ID   CarModel    Year
14   Ford        1996
15   Ferrari     2005
16   Toyota      2010

ou

#Table3
ID   CarModel    Year
16   Ford        1996
14   Toyota      2010
15   Ferrari     2005

P.S. je comprends comment faire cela avec CTE et row_number(), mais je pense qu'il y a une façon plus facile de faire cette tâche. Et peut-être ce code sera utilisé dans MS SQL Server 2000, donc je serai heureux de regarder d'autres variantes des solutions.

4
demandé sur Tim Lehner 2012-01-18 23:29:09

1 réponses

Voici une jonction triangulaire qui fonctionnerait dans SQL Server 2000 selon le commentaire de Martin Smith:

-- 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

bien sûr, cela suppose que le Tableau1.ID est unique et Table2.CarModel + Tableau2.L'année est unique.

les considérations de performance des joints triangulaires sont bien discutées ici: http://www.sqlservercentral.com/articles/T-SQL/61539 /

7
répondu Tim Lehner 2012-07-11 21:27:11