1

我正在做一个相当简单的家庭作业,我必须检索一些符合某些条件的数据,然后对上一个查询中选择的数据运行另一个查询。

我创建了一个临时表并使用第一个查询的结果填充它,然后在该表上运行第二个查询。然后我放下桌子。

问题是:如果我删除表,第二个查询是空的,因为结果被丢弃。我不明白这一点。我不使用临时表进行选择,仅用于数据验证。然而,如果在查询结束时删除了表,则查询返回空。如果我不放下桌子,它就可以正常工作。但是如果我再次运行查询,它会说表存在。我在这里做错了什么。这是代码:

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);
4

1 回答 1

0

临时表是在一个特殊的临时模式中创建的,对每个会话都是唯一的。它们仅在同一会话中可见,并且仅在会话结束之前可见(除非提前删除)。

该临时模式隐含地search_path(在系统模式之后pg_catalog)中的第一个模式,因此它有效地隐藏了其他同名表。根据文档:

当临时表存在时,同名的现有永久表对当前会话不可见,除非它们使用模式限定名称进行引用。

删除临时表后,下一个具有相同名称的表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()是一个普通函数,而不是一个聚合函数。

于 2014-08-01T14:13:13.630 回答