2012-01-18 6 views
4

Par exemple, j'ai deux tables (tables temporaires). L'un d'entre eux ne contient que des identifiants, et l'autre contient des informations réelles. Ils ont exactement le même numéro de rangée.Comment joindre deux tables sans condition

#Table1 
ID 
14 
15 
16 

#Table2 
CarModel Year 
Ford  1996 
Ferrari  2005 
Toyota  2010 

Comment puis-je joindre à cette table deux en un seul (sans aucune condition, juste la table de résultats 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 d'identité. Il existe un mécanisme propre à obtenir des ID pour l'insertion. Je ne suis pas capable de le changer.

Donc, par conséquent je besoin d'une table comme un des éléments suivants (ordre n'a pas d'importance):

#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 

post-scriptum Je comprends comment faire cela avec CTE et row_number(), mais je pense qu'il est 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.

+2

'row_number()' serait la façon d'y parvenir. Cependant, je devrais demander pourquoi vous voudriez une jointure sur ces deux tables si elles ne contiennent pas réellement des données relatives. – Tejs

+1

CTE et 'ROW_NUMBER' semble le meilleur moyen pour moi. Pour SQL Server 2000, vous devez le simuler avec une colonne 'identity' ou une jointure triangulaire ou utiliser des curseurs. –

+0

@Tejs Merci pour votre réponse. J'ai besoin de cette date jointe pour l'insérer dans une table réelle (pas temporaire). Et j'ai besoin que mes lignes insérées aient des identifiants, que j'ai obtenus d'une procédure stockée. Mais je ne me soucie pas vraiment de l'identité concrète de chaque rangée. Tout ce dont j'ai besoin, c'est qu'ils seront tous issus de ma "piscine" Oui ce n'est pas le meilleur schéma, mais c'est et je dois travailler avec. –

Répondre

7

Voici un triangle joindre qui travaillerait dans SQL Server 2000 par 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 Table1.ID est unique et Table2.CarModel + Table2.Year est unique.

Les considérations de performances triangulaires sont discutées bien jointures ici: http://www.sqlservercentral.com/articles/T-SQL/61539/

+0

Pourquoi la condition de moulage complexe? Et non 'où CarModel

+0

Le plan d'exécution et les statistiques io sont identiques sur ma boîte. Quoi qu'il en soit, c'est à l'OP d'apporter des modifications pour s'adapter à ses normes de code. –

+0

Pour une petite table, cela n'aurait pas d'importance. –