首页 > 解决方案 > 临时表丢失所有行,除非单独选择?

问题描述

PostgreSQL 新手,遇到一些问题。我有很长的代码集,其中使用了许多临时表,其中一个“主”临时表正在使用其他所有临时表的内容进行更新。但是,其中一张表的工作方式与其他表不同。这是它的代码:

--cargo and dwt creation
drop table if exists t_cargo;
create temp table t_cargo as
select
    a.*,
    b.dwt,
    (b.dwt * .98) as cargo
from
    t_vessel_list a
join
     tanker b on a.imo = b.imo;
--end

--select * from t_cargo

--update cargo and dwt
UPDATE t_vessel_list
SET metric_tons = b.dwt,
vessel_cargo = b.cargo
FROM t_cargo b
WHERE t_vessel_list.vessel = b.vessel;
--end

该表在查询中的其他任何地方都没有被调用,但是当它作为整个查询的一部分运行时,该表没有数据。如果它单独运行(如,突出显示然后运行),它只会有数据并正确更新它。否则,它是空的,并且更新导致空列。

根据要求,这是查询中的第二个临时表,它确实有效:

--create a table for draught data, separate because joins will filter
drop table if exists t_ais_draught;

create temp table t_ais_draught as
select distinct
    a.*,
    b.date,
    b.destination,
    b.poi,
    b.draught
from
    t_vessel_list a
join lateral
    (
    select * from asvt_position b where a.vessel = b.vessel order by 2 desc 
    limit 1
    ) b on true;
--end


--update draughts
UPDATE t_vessel_list
set v_draught = b.draught
FROM t_ais_draught b
where t_vessel_list.vessel = b.vessel;
--end

这组代码有效,并且与第一组代码的差异很小。查询中的所有代码看起来都像第一个或第二个临时表代码,除了我在顶部链接的代码之外,所有代码都可以正常工作。

**经过更多的试验和错误,我发现解决方案是将临时表和更新调用移动到查询的后面部分。这样做之后,它看起来并没有弄乱查询的任何其他部分,但我仍然不明白为什么这首先不起作用。如前所述,在发布的代码之外的查询中的任何地方都不会调用 t_cargo 表。

谁能解释发生了什么?

标签: postgresql

解决方案


推荐阅读