无法在视图定义中创建临时表(PostgreSQL)。

6
CREATE  VIEW  viewRebalancingLog AS


CREATE TEMP TABLE newSessionID
(
  ilog_id INT,vch_service_name VARCHAR(200), vch_service_id  VARCHAR(200),iuser_id INT,vch_session_id  VARCHAR(200),
  isequence_id INT,vch_message_type  VARCHAR(200),vch_message_sub_type  VARCHAR(200),vch_message  VARCHAR,
  dt_service_log_time TIMESTAMP,dt_inserted_date TIMESTAMP
)


 INSERT INTO newSessionID
      ("ilog_id", "vch_service_name", "vch_service_id"  , "iuser_id" , "vch_session_id"  , "isequence_id" ,
  "vch_message_type"  ,"vch_message_sub_type","vch_message","dt_service_log_time","dt_inserted_date"
)
SELECT
     "LOGS"."ilog_id", "LOGS"."vch_service_name","LOGS"."vch_service_id","LOGS"."iuser_id" ,"LOGS"."vch_session_id"  ,
  "LOGS"."isequence_id" ,"LOGS"."vch_message_type"  ,"LOGS"."vch_message_sub_type" ,"LOGS"."vch_message",
  "LOGS"."dt_service_log_time","LOGS"."dt_inserted_date"
  FROM services_logs_stg AS "LOGS"
   WHERE ("LOGS".dt_service_log_time AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York') :: DATE =
         (((NOW() -
           INTERVAL '2 day')  :: TIMESTAMP) AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York') :: DATE
1个回答

8

无法在视图内创建临时表。请查看CREATE VIEW

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW 名称 [ ( 列名 [, ...] ) ] [ WITH ( 视图选项名称 [= 视图选项值] [, ... ] ) ] AS 查询

为什么不使用简单的CREATE VIEW ... AS SELECT

CREATE  VIEW  viewRebalancingLog AS
SELECT
     "LOGS"."ilog_id", "LOGS"."vch_service_name","LOGS"."vch_service_id","LOGS"."iuser_id" ,"LOGS"."vch_session_id"  ,
  "LOGS"."isequence_id" ,"LOGS"."vch_message_type"  ,"LOGS"."vch_message_sub_type" ,"LOGS"."vch_message",
  "LOGS"."dt_service_log_time","LOGS"."dt_inserted_date"
  FROM services_logs_stg AS "LOGS"
   WHERE ("LOGS".dt_service_log_time AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York') :: DATE =
         (((NOW() -
           INTERVAL '2 day')  :: TIMESTAMP) AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York') :: DATE;

如果您需要某种中间步骤,请考虑使用公共表达式编辑:

不,这不是我发布的查询的结尾,我有更多的临时表并相互连接。我的目标是:1.创建临时表1,2.在临时表1中插入数据,然后3.创建临时表2,4.在临时表2中插入数据,5.创建临时表3,6.从temp1 join temp2插入数据,7.选择* from temp3

您可以简单地像我之前提出的那样使用CTE
WITH temp1 AS (
    SELECT  ...
    FROM ...
), temp2 AS (
    SELECT ...
    FROM ...
)
SELECT *
FROM temp1
JOIN temp2
  ON ...

不,我必须在那之下使用临时表。还有其他解决方案吗?请帮忙。 - Riyan
@DhurjatiBorah:为什么你认为你“必须”使用临时表?这个答案中的视图将返回与您(不正确的)视图完全相同的数据。 - user330315
不,这不是我发布的查询的结尾, 我有更多的临时表,并且彼此连接。 我的目标是: 1.创建临时表1, 2.将数据插入临时表1 然后 3.创建临时表2 4.将数据插入临时表25.创建临时表3 6.从temp1 join temp2插入数据7.从temp3选择* - Riyan
1
@DhurjatiBorah 我仍然不明白临时表的意义。使用CTE就足够了。 - Lukasz Szozda
@DhurjatiBorah:如果视图的结果取决于一堆插入操作,那么视图就不是正确的工具。我非常怀疑所有这些临时表是否真的必要(你是从SQL Server移植过来的吗?)。通常情况下,您只需在视图中连接/联合这些查询即可。为什么您认为您需要所有这些临时表?为什么不能简单地创建一个单一的查询?如果您真的认为需要这样做,那么使用返回集函数是正确的方法。 - user330315
1
现在我正在使用SELECT查询、JOIN和UNION来互相连接。谢谢帮助。 - Riyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接