Перекрестное соединение 'n' раз за столом - PullRequest
0 голосов
/ 12 мая 2010

Можно написать обобщенную функцию / процедуру / выбор / что-то еще, чтобы перекрестное соединение таблицы с самим собой 'n' раз? (да, 'n' - это заданный параметр:)

Как бы вы это сделали?


Пример

Имея эту таблицу:

 Value
-------
   1
   2
   3 

кросс-соединение 2 раза, вернется:

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

Ответы [ 4 ]

5 голосов
/ 12 мая 2010

Используя динамический SQL, SQL Server 2005+ (@table_name и @numCrossJoins - это параметры хранимой процедуры):

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
3 голосов
/ 12 мая 2010

Вы можете генерировать динамический sql для вывода столько перекрестных соединений, сколько вам нужно:

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
2 голосов
/ 12 мая 2010

Попробуйте это:

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

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

EXEC sp_executesql @SQL;
1 голос
/ 12 мая 2010

Если вам нужно придумать все возможные варианты, вот пример:

Все перестановки для строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...