私は、これを実装する価値があるとは考えていないと考えています。 Postgres does support bothUNION
とUNION ALL
のように見えます。
この機能を使用する場合は、Connect(またはその置き換え先のURL)にフィードバックを送信できます。
重複を追加するのを防ぐことは、後のステップで前のステップに追加された重複行がほとんどいつも無限ループを引き起こしたり、最大再帰制限を超えてしまうために役立ちます。
コードは、このような
以下のようにUNION
を実証使用されているSQL Standardsでかなりの数の場所があります。この記事では、どのようにthey are implemented in SQL Serverを説明します。彼らはそのようなことをしていません。スタックスプールは行を削除するので、後の行が削除された行の複製であるかどうかを知ることはできません。 UNION
をサポートするには、やや異なるアプローチが必要です。
これまでのところ、マルチステートメントのTVFで同じことを達成するのは簡単です。UNION ALL
にUNION
を変更し、最後にDISTINCT
は無限再帰からあなたを保存されません追加する(Postgres Fiddle)
WITH R
AS (SELECT 0 AS N
UNION
SELECT (N + 1)%10
FROM R)
SELECT N
FROM R
下の愚かな例を取るために
。
しかし、あなたは上記の重複を破棄するIGNORE_DUP_KEY
を使用しています
CREATE FUNCTION dbo.F()
RETURNS @R TABLE(n INT PRIMARY KEY WITH (IGNORE_DUP_KEY = ON))
AS
BEGIN
INSERT INTO @R
VALUES (0); --anchor
WHILE @@ROWCOUNT > 0
BEGIN
INSERT INTO @R
SELECT (N + 1)%10
FROM @R
END
RETURN
END
GO
SELECT *
FROM dbo.F()
としてこれを実装することができます。列リストの幅が広すぎて索引付けができない場合は、代わりにDISTINCT
とNOT EXISTS
が必要です。おそらく、再帰の最大回数を設定し、無限ループを回避するパラメータが必要になるでしょう。
私はあなたが意味するものが得られないので、いくつかのコードをご覧ください。 – Sami
コメントしますか? –
@Sami再帰的なCTEの定義では、再帰的なクエリにアンカークエリ 'UNION ALL'を必要とします。私はUNIONではなくUNION ALLにする必要があるのかと尋ねています。これは、オプティマイザがおそらく何らかの形でやっていると思います。 –