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

3

我的表格长这样:

CREATE TABLE gyerek (
    gyereke INT,
    szulonek INT
);

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

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:递归 WITH 子句中的 UNION ALL 操作必须只有两个分支。
我的问题是:是否有一种方式可以使用多个 UNION ALL 语句?如果没有,我该如何实现最后两个 SELECT 语句的合并。

你对这个查询有什么期望?我认为它可以更容易地编写,而且顺便说一句,如果它起作用了,它会返回重复的记录。这是你想要的吗? - Amir Pashazadeh
你真的需要使用 UNION ALL 吗?使用 SELECT r1.x, gy1.gyereke FROM rokon r1 join gyerek gy1 ON gy1.szulonek IN (r1.x, r1.y) 不就可以了吗? - Thorsten Kettner
实际上,我正在尝试将“Datalog”规则重写为“SQL”。我不知道是否有更简单的方法,最近我开始学习这种语言,我想知道为什么我不能使用多个“UNION ALL”。 - Fogarasi Norbert
你正在创建一个递归的 WITH 子句。你知道这一点,对吗?递归的 WITH 子句由 <锚定部分> UNION ALL <递归部分> 组成。第二个 UNION ALL 不应该出现在那里。 - Thorsten Kettner
我知道这是一个递归的 WITH 子句。但是我在 Datalog 中有三个条件,因此我有三个 SELECT 语句。 - Fogarasi Norbert
1个回答

2
在递归过程中,您希望在匹配到y时继续使用x,并在匹配到x时继续使用y。使用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)
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接