我正在做一个相当简单的家庭作业,我必须检索一些符合某些标准的数据,然后对上一个查询中选择的数据运行另一个查询。
我创建了一个临时表,并用第一个查询的结果填充它,然后在表上运行第二个查询。然后我放下桌子。
问题在于:如果我删除表,则第二个查询为空,因为结果被丢弃。我不明白这一点。我不使用临时表进行选择,仅用于数据验证。然而,如果在查询结束时删除了表,则查询返回空。如果我不放弃它,它工作正常。但是,如果我再次运行查询,它表示表存在。我在这做错了什么。这是代码:
SELECT DISTINCT gno
INTO TEMPORARY TABLE TMP
FROM edge
WHERE weight>100;
SELECT gname, gsum(graph.gno)
FROM TMP, graph
WHERE graph.gno = TMP.gno AND gsum(graph.gno)>=ALL
(SELECT gsum(graph.gno)
FROM graph);
答案 0 :(得分:0)
临时表是在特殊的临时模式中创建的,对每个会话都是唯一的。它们仅在同一会话中可见,并且仅在会话结束时显示(除非先前删除)。
临时模式隐式是search_path
中的第一个模式(在系统模式pg_catalog
之后),因此它有效地隐藏了其他同名表。 Per documentation:
具有相同名称的现有永久表对于不可见 临时表存在时的当前会话,除非它们存在 用模式限定名称引用。
删除临时表后,search_path
中具有相同名称的下一个表将再次显示。该表在其现有gno
列中没有任何匹配值。结果是空的。
情况一定是这样的,因为如果不存在这样的表,你就不会得到空结果,但下次尝试时会出现错误信息。
此外,您的第二个查询应该是:
SELECT gname, gsum(graph.gno)
FROM tmp
JOIN graph USING (gno)
WHERE gsum(graph.gno) = (
SELECT max(gsum(graph.gno))
FROM graph
);
使用明确的JOIN
语法和简化的WHERE
条件
假设gsum()
是普通函数,不是聚合函数。