0 votes

Requête de jointure croisée 'n' fois d'une table

Est-il possible d'écrire une fonction/générale procédure/sélection/autre chose pour faire une jointure croisée d'une table contre elle-même 'n' fois? ('n' est un paramètre donné : )

Comment le feriez-vous?


Exemple

En ayant cette table:

 Value
-------
   1
   2
   3 

faire une jointure croisée 2 fois, retournerait:

 Value  | Value
------------------
    1       1
    1       2
    1       3
    2       1
    2       2
    2       3
    3       1
    3       2
    3       3

5voto

OMG Ponies Points 144785

En utilisant SQL dynamique, SQL Server 2005+ (@table_name et @numCrossJoins sont des paramètres de la procédure stockée) :

DECLARE @upperLimit INT
    SET @upperLimit = 1

DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = 'SELECT * FROM '+ @table_name +' '

BEGIN 

  WHILE (@upperLimit <= @numCrossJoins)
  BEGIN

    SET @SQL = @SQL + 'CROSS JOIN '+ QUOTENAME(@table_name) +' '

    SET @upperLimit = @upperLimit + 1
  END

  EXEC sp_executesql @SQL

END

3voto

Paul Kearney - pk Points 3300

Vous pouvez générer du SQL dynamique pour afficher autant de jointures croisées que vous avez besoin :

create table #t (value int)

insert into #t values (1)
insert into #t values (2)
insert into #t values (3)

declare @n int
set @n = 4

declare @sql varchar(max)
set @sql = 'SELECT * FROM #t t'
declare @i int
set @i = 0
while (@i <= @n)
begin
    set @sql = @sql + ' cross join #t t' + CAST(@i as varchar)
    set @i = @i + 1
end

print @sql
execute(@sql)

drop table #t

2voto

Michael Buen Points 20453

Essayez cela:

SET @SQL = 'SELECT * FROM ' + replicate('[' + @table_name + '],', @N);

set @SQL = LEFT(LEN(@SQL) - 1);

EXEC sp_executesql @SQL;

1voto

AlexKuznetsov Points 9555

Si vous avez besoin de trouver toutes les permutations possibles, voici un exemple :

Toutes les permutations pour une chaîne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X