在WITH子句中使用多个UNION ALL语句

时间:2017-12-10 20:38:37

标签: sql oracle recursive-query

我的表格如下:

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语句的统一。

1 个答案:

答案 0 :(得分:2)

在递归中,您希望x匹配yy匹配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)
)