Postgresql 临时表是否丢失所有行,除非单独选择?
PostgreSQL新手,有一些问题。我有一套很长的代码,使用了很多临时表,其中一个“主”临时表正在使用其他每个临时表的内容进行更新。但是,其中一个表的工作方式与其他表不同。下面是它的代码:Postgresql 临时表是否丢失所有行,除非单独选择?,postgresql,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_vesse
--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表在查询中的任何地方都不会调用发布的代码之外的内容
有人能解释一下发生了什么事吗?一定是哪里出了错。临时表不仅仅会丢失数据。您的代码似乎还可以,但您的问题并不清楚。你能写两个分开的代码并显示哪一个工作,哪一个不工作吗。还提供一些样本数据,以便我们可以尝试重现问题。尝试在@JuanCarlosOropeza中创建一个示例。我添加了第二个有效的代码。我猜select在创建表时没有任何数据,因为您正在使用时态表。检查创建顺序。您还可以使用您知道有数据的实际表来测试它。如果您得到了更新,那么您就知道问题出在哪里了。