Je suppose que la raison en est qu'ils n'ont tout simplement pas considéré cette fonctionnalité comme prioritaire et digne d'être mise en œuvre. Il semble que Postgres fait soutenir à la fois UNION
y UNION ALL
.
Si vous avez des arguments solides en faveur de cette fonctionnalité, vous pouvez fournir des informations à l'adresse suivante Connectez-vous à (ou quelle que soit l'URL de son remplacement).
Empêcher l'ajout de doublons pourrait être utile, car une ligne en double ajoutée dans une étape ultérieure à une précédente finira presque toujours par provoquer une boucle infinie ou par dépasser la limite de récursivité maximale.
Il y a pas mal d'endroits dans le Normes SQL où le code est utilisé démontrant UNION
comme ci-dessous
Cet article explique comment ils sont mis en œuvre dans SQL Server . Ils ne font rien de tel "sous le capot". Le spool de la pile supprime les lignes au fur et à mesure, il ne serait donc pas possible de savoir si une ligne ultérieure est le double d'une ligne supprimée. Support de UNION
nécessiterait une approche quelque peu différente.
Entre-temps, vous pouvez facilement réaliser la même chose avec un TVF à déclarations multiples.
Pour prendre un exemple stupide ci-dessous ( Fiddle de Postgres )
WITH R
AS (SELECT 0 AS N
UNION
SELECT ( N + 1 )%10
FROM R)
SELECT N
FROM R
Changer le UNION
a UNION ALL
et l'ajout d'un DISTINCT
à la fin ne vous sauvera pas de la récursion infinie.
Mais vous pouvez l'implémenter comme
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 ()
Les utilisations ci-dessus IGNORE_DUP_KEY
pour éliminer les doublons. Si la liste des colonnes est trop large pour être indexée, il faut utiliser la méthode suivante DISTINCT
y NOT EXISTS
au lieu de. Vous voudrez probablement aussi un paramètre pour définir le nombre maximum de récursions et éviter les boucles infinies.