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

时间:2017-08-26 16:45:53

标签: sql postgresql view temp-tables postgresql-9.4

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 个答案:

答案 0 :(得分:2)

您无法在VIEW中创建临时表。检查CREATE VIEW

  

创建[OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW名称[(column_name [,...])]           [WITH(view_option_name [= view_option_value] [,...])]           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;

如果您需要某种中间步骤,请考虑使用common table expressions

修改

  

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

您可以像我之前提议的那样使用CTE

WITH temp1 AS (
    SELECT  ...
    FROM ...
), temp2 AS (
    SELECT ...
    FROM ...
)
SELECT *
FROM temp1
JOIN temp2
  ON ...