sql - PostgreSQL 如果删除临时表查询为空

标签 sql postgresql temporary-objects

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

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

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

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

最佳答案

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

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

Existing permanent tables with the same name are not visible to the current session while the temporary table exists, unless they are referenced with schema-qualified names.

一旦删除临时表,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() 是一个普通函数,不是聚合函数。

关于sql - PostgreSQL 如果删除临时表查询为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25075989/

相关文章:

postgresql - 为什么我看不到表的列名?

sql - 如何在查询的 WHERE 子句中检查 'any or limited'?

c++ - 我可以访问临时对象的成员吗?

c++ - 使用 std::function 作为成员函数,它捕获 `this` ,并在析构函数后从复制的 lambda 访问它

c++ - 在异常情况下将临时对象绑定(bind)到非常量引用

sql - T-SQL 中的 DateTimeOffset.Now

SQL 动态日期但固定时间查询

sql - 事实表缓慢变化?

sql - NOT EXISTS with NULLs 与其他运算符不一致

linux - 从 Shell 脚本运行 Postgres 命令