我的桌子看起来像这样:

CREATE TABLE gyerek (
    gyereke INT,
    szulonek INT
);


我试图在我的UNION ALL子句中使用多个WITH语句:

WITH testver (x, y) AS (
    SELECT gy1.gyereke, gy2.gyereke
    FROM gyerek gy1, gyerek gy2
    WHERE gy1.szulonek = gy2.szulonek
    AND gy1.gyereke <> gy2.gyereke
), rokon (x, y) AS (
    SELECT * FROM testver
    UNION ALL
    (SELECT r1.x, gy1.gyereke
    FROM rokon r1, gyerek gy1
    WHERE r1.y = gy1.szulonek)
    UNION ALL(SELECT gy1.gyereke, r1.y
    FROM rokon r1, gyerek gy1
    WHERE r1.x = gy1.szulonek)
)
SELECT * FROM rokon;


我收到以下错误:

ORA-32041: UNION ALL operation in recursive WITH clause must have only two branches

我的问题是:有没有办法使用多个UNION ALL语句?如果没有,我如何才能实现最后两个SELECT语句的统一。

最佳答案

在递归中,要在x匹配上继续y并在y匹配上继续x。使用CASE WHEN检查哪一个匹配。

, rokon (x, y) AS (
  SELECT x, y FROM testver
  UNION ALL
  SELECT CASE WHEN gy1.szulonek = r1.x THEN r1.y ELSE r1.x END, gy1.gyereke
  FROM rokon r1
  JOIN gyerek gy1 ON gy1.szulonek IN (r1.x, r1.y)
)

10-07 15:05