临时表会丢失所有行,除非单独选择?

时间:2018-07-23 13:33:54

标签: postgresql

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

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

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

任何人都可以解释发生了什么事吗?

0 个答案:

没有答案