Может ли кто-нибудь объяснить мне, как именно этот SQL-запрос работает точно?Как работает этот рекурсивный SQL CTE?
WITH recursive n(n) AS (
SELECT 2 n
UNION ALL
SELECT n+1 FROM n WHERE n<1000
)
SELECT a.n
FROM n a
LEFT JOIN n b
ON b.n < sqrt(a.n)
GROUP BY a.n
HAVING a.n=2 OR MIN(a.n % b.n) > 0;
Это произведет следующее в POSTGRESQL:
n
====
251
887
601
647
577
...
9
(177 rows)
Мое понимание линию за линией пробоя:
SELECT 2 n
- выбрать номер 2, как п [анкерного элемента of CTE]
UNION ALL
- объединить с рекурсивным компонентом n + 1 от n < 1000, поэтому отобразить все номера от 2 до 10 00
SELECT a.n FROM n a
- запустить приведенный выше запрос [рекурсивный член КТР]
LEFT JOIN n b
- левый присоединиться номера 2-1000 со вторым набором чисел
ON b.n < sqrt(a.n)
- где второй набор чисел меньше квадратного корня из первого столбца чисел?
GROUP BY a.n
- отображать только первый столбец чисел
HAVING a.n=2 OR MIN(a.n. % b.n) > 0
- ... где А = 2 или минимум А по модулю B больше 0?
Это глупый запрос, но любая помощь в расшифровке будет оценена по достоинству.
Я думаю, что целью здесь является генерация простых чисел менее 1000. Однако результаты, похоже, не подтверждают, что, поскольку вы получаете 25,49 и т. Д. –
внимательно изучая результаты, я думаю, что ваш запрос генерирует все простые числа и их квадраты меньше 1000. Но вы должны добавить еще одно условие в предложение 'have',' HAVING an = 2 ИЛИ an = 3 ИЛИ MIN (a% bn)> 0', чтобы включить 3 в результаты. –