SQL кросс-соединение для создания числовой последовательности - PullRequest
1 голос
/ 11 июня 2011

Я пытался выяснить, как этот запрос SQL генерирует последовательность чисел, и я до сих пор не понимаю.

Таблица цифр

digit
--------
0
1
2
3
4
5
6
7
8
9


SELECT D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS n
FROM    dbo.Digits as D1
CROSS JOIN dbo.Digits as D2
CROSS JOIN dbo.Digits AS D3
ORDERY BY n;

Результат запроса ...

n
------
1
2
3
4
5
...
998
999
1000

Как это работает?

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Если вы в CTE, это даст вам от 1 до 1000.


;
with
Num(Pos) as
(
    select cast(1 as int)
    union all 
    select cast(Pos + 1 as int) from Num where Pos &lt 1000
)
select * from Num option (maxrecursion 0)
2 голосов
/ 11 июня 2011

A перекрестное объединение является декартовым произведением : то есть каждая строка соединяется с каждой второй строкой.

Таким образом, таблица из 11 строк соединяется с 7 строкамиТаблица дает 77 строк

В вашем случае у вас есть 10 строк * 10 строк * 10 строк = 1000.

Попробуйте этот запрос, чтобы увидеть необработанную дату перед генерацией числа

SELECT D3.digit, D2.digit, D1.digit
FROM    dbo.Digits as D1
CROSS JOIN dbo.Digits as D2
CROSS JOIN dbo.Digits AS D3
ORDER BY d3, d2, d1;

То, как у вас есть 100*d3 + 10*d2 + d1, повторяет то, как мы считаем естественным образом и как выполняем.

1 голос
/ 11 июня 2011

Значения цифры из таблицы D3 будут в диапазоне от 0 до 900 (D3.digit * 100)

Значения цифры из таблицы D2 будут в диапазоне от 0 до 90 (D2.digit * 10)

Значения цифры из таблицы D1 будут в диапазоне от 0 до 9 (D1.digit * 100)

Добавьте их, и у вас будет диапазон от 0 до 999

Добавьте 1 к результату, и у вас будет диапазон от 1 до 1000

1 голос
/ 11 июня 2011

CROSS JOIN очень похоже на INNER JOIN MYTable on 1 = 1, в результате чего получается декартово произведение ваших входных наборов

По сути, для каждой записи слева онообъединения для каждой записи справа.

В случае исходной таблицы из 10 цифр первое перекрестное соединение приводит к 100 записям.

В случае второго перекрестного соединения кВ той же 10-значной исходной таблице вы снова получаете все 100 предыдущих записей для каждой записи в исходной таблице, в результате чего получается 1000 записей.

Ваша итоговая таблица будет выглядеть так, если вы используете оператор Selectбыло "Выбрать * ..." Порядок по ...

D1    D2    D3
1     2     3
1     2     4
1     2     5

Если вы возьмете эти значения в таблице выше и объедините их (затем добавите одно), вы получите последовательные числа.

"1" + "2" + "3" = 123  (+1 = 124)
"1" + "2" + "4" = 124  (+1 = 125)
"1" + "2" + "5" = 125  (+1 = 126)

Очевидно, автор не объединяет.Однако он выполняет математический эквивалент.

1 * 100 + 2 * 10 + 3 * 1 + 1 = 124
1 * 100 + 2 * 10 + 4 * 1 + 1 = 125
1 * 100 + 2 * 10 + 5 * 1 + 1 = 126

В конечном итоге автор изобрел странный способ представить список чисел от 1 до 1000.

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