Перекрестное соединение SQL Server

Я использую функцию CROSS JOIN для создания представления. Код, который я нашел, выглядит следующим образом.

SELECT tbl.*
  ,y.GOAL_VERSION_NO
FROM EVALGOAL_GROUP_EMP AS tbl
CROSS JOIN (SELECT TOP (SELECT MAX(GOAL_VERSION_NO) FROM GOAL) * FROM(VALUES(1),(2),(3),(4),(5) /*add the max count here*/) AS x(GOAL_VERSION_NO)) AS y

В этом примере кода вывод SELECT MAX(GOAL_VERSION_NO) FROM GOAL может быть любым значением, скажем, от 1 до 1000. Но я научился вставлять только значения CROSS JOIN как VALUES (1),(2),(3) и так далее, как я делал в своем коде. Могу ли я каким-либо образом ввести здесь неограниченное количество значений перекрестного соединения (под неограниченным я подразумеваю максимум 1000, и это сложно для жесткого кода, как указано выше, и иногда это может быть более 1000).
Пожалуйста, помогите мне. Спасибо.


person jayz    schedule 26.04.2016    source источник
comment
используйте NUMBER TABLE. Создайте числовую таблицу с максимальным значением, которое вам требуется   -  person Squirrel    schedule 26.04.2016


Ответы (1)


Вы можете использовать Tally Table для создания последовательность чисел до желаемого значения:

DECLARE @Range AS INT = 1000;

WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
CteTally(GOAL_VERSION_NO) AS(
    SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E4
)
SELECT
    tbl.*,
    y.GOAL_VERSION_NO
FROM EVALGOAL_GROUP_EMP AS tbl
CROSS JOIN CteTally y

Упрощенное объяснение Tally Table

person Felix Pamittan    schedule 26.04.2016
comment
@jayz, пожалуйста, прочитайте статью, на которую есть ссылка, прежде чем использовать этот код в производстве. - person Felix Pamittan; 26.04.2016