【问题标题】:Cannot create temporary table in view definition PostgreSQL无法在视图定义 PostgreSQL 中创建临时表
【发布时间】:2018-02-04 11:05:00
【问题描述】:
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

【问题讨论】:

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


    【解决方案1】:

    您不能在 VIEW 中创建临时表。检查CREATE 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.create temp table1, 2.insert data in temp table1 than 3.create temp table 2 4.insert data in temp table 2 5.create temp table 3 6.insert data from temp1 join temp2 7. select *从 temp3

    您可以像我之前建议的那样简单地使用CTE

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

    【讨论】:

    • 不,我必须使用临时表。任何其他解决方案。请帮助。
    • @DhurjatiBorah:为什么你认为你“必须”使用临时表?此答案中的视图将返回与您的(不正确的)视图完全相同的数据
    • 不,这不是我发布的查询的结尾,我有更多的临时表并相互连接。我的目标是:1.create temp table1, 2.insert data in temp table1 than 3.create temp table 2 4.insert data in temp table 2 5.create temp table 3 6.insert data from temp1 join temp2 7. select *从 temp3
    • @DhurjatiBorah 我仍然看不到临时表的意义。 CTE 就足够了。
    • 正确。现在我使用 select 查询和 joinand 彼此联合。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2023-02-21
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多