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