Sql 使用CTE显示数据中的可传递关系

Sql 使用CTE显示数据中的可传递关系,sql,postgresql,common-table-expression,Sql,Postgresql,Common Table Expression,我正在研究一个考古数据库,其中包括两个描述地层单位之间空间关系的表格。这很简单——一个单位要么高于另一个单位,要么低于另一个单位。为此,我有一个表格记录了单位1、单位2以及它们之间的空间关系类型。我还想生成一个视图,该视图还记录可传递的对应项。换句话说,如果A单元在B单元之上,我还需要一个临时行,说明B单元在A单元之下 这就是我的CTE目前的样子。我得到的错误是错误:关系矩阵不存在,所以这可能不是实现它的方法。但这里的想法是,当关系为“高于”时(与1相同),INSERT命令应在创建的表中添加一行

我正在研究一个考古数据库,其中包括两个描述地层单位之间空间关系的表格。这很简单——一个单位要么高于另一个单位,要么低于另一个单位。为此,我有一个表格记录了单位1、单位2以及它们之间的空间关系类型。我还想生成一个视图,该视图还记录可传递的对应项。换句话说,如果A单元在B单元之上,我还需要一个临时行,说明B单元在A单元之下

这就是我的CTE目前的样子。我得到的错误是错误:关系矩阵不存在,所以这可能不是实现它的方法。但这里的想法是,当关系为“高于”时(与1相同),INSERT命令应在创建的表中添加一行新行,其中两个单位是反向的,并且关系低于或等于2。非常感谢您的帮助,提前谢谢

WITH matrix_cte  (unit, related_unit, relationship)
AS (SELECT lookup_unit,
lookup_unit_2,
lookup_unit_relationship

FROM register_unit_matrix)
INSERT INTO matrix_cte(unit, related_unit, relationship)
SELECT lookup_unit_2, lookup_unit, 2
FROM (register_unit_matrix

INNER JOIN matrix_cte ON ((register_unit_matrix.lookup_unit = matrix_cte.unit)))
WHERE relationship = 1;
您无法插入CTE。CTE是一个逻辑表,它是结果集的别名。您可以从CTE中选择。 不太确定你在那里想要达到什么

错误:关系矩阵不存在

此错误消息意味着您只能在关系表中插入。CTE不是一个表,它不是数据库中的永久对象,并且您的数据库没有一个名为matrix_CTE的表

要生成所有关系,可以将两个结果集合并在一起,包括直接关系和反向关系。如果原始表只有一个方向上的关系,则可以使用UNIONALL,查询速度会更快。我的意思是,如果原始表中的同一对单元从来没有两行:

unit1, unit2, 1
unit2, unit1, 2
然后你可以使用下面所有的联合。如果原始表可能有这样的重复项,则应使用UNION删除额外的重复项

-- all direct relationships as they are
SELECT 
    lookup_unit,
    lookup_unit_2,
    lookup_unit_relationship
FROM register_unit_matrix

UNION

-- inverse all relationships 
SELECT 
    lookup_unit_2,
    lookup_unit,
    CASE WHEN lookup_unit_relationship = 1 THEN 2 ELSE 1 END AS lookup_unit_relationship
FROM register_unit_matrix
您可以将上述查询放入视图中,或按原样使用