誰かがこの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
- Nとして数2 [アンカー部材を選択しますのCTE]
UNION ALL
- n <から再帰的なコンポーネントn + 1と結合するので、2から1000年
SELECT a.n FROM n a
- [CTEの再帰メンバ]
LEFT JOIN n b
上記クエリを実行する - 第二セット -
ON b.n < sqrt(a.n)
数の第二のセットと数2〜1000に参加左数の最初の列の平方根よりも小さいですか?
GROUP BY a.n
- モジュロBのA = 2又は最小値が0よりも大きい... - 数字のみ
HAVING a.n=2 OR MIN(a.n. % b.n) > 0
の最初の列を表示しますか?
これは愚かなクエリですが、それを解読する際の助けに感謝します。適切に固定
ここでは、1000未満の素数を生成することを意図していると思いますが、結果は25,49などが得られるようには見えません。 –
結果をよく見ると、それらの四角形は1000未満ですが、結果に3を含めるために、 'having'節に条件を1つ追加する必要があります。' HAVING = 2 OR = 3 OR MIN(%bn)> 0'です。 –