【问题标题】:create view in postgresql在 postgresql 中创建视图
【发布时间】:2021-08-15 11:12:18
【问题描述】:

我在 PostgreSQL 数据库中有几个表和两个函数。 我将 SQL Server 数据库迁移到 PostgreSQL 数据库。 现在,我想创建一个从多个表中获取数据的视图。 这在 SQL Server 中可以正常工作,但在 PostgreSQL 中却不行,因为它具有不同的架构和语法。 有谁知道如何在 PostgreSQL 中创建视图? 如何将 SQL Server 视图转换为 PostgreSQL? 我是 PostgreSQL 新手,对它了解不多。 所以,这是我的"payment_status" 查看代码

 ALTER VIEW "PAYMENT_STATUS" AS 
SELECT        dbo.PAYMENTS.ID, dbo.PAYMENTS.ACADEMIC_YEAR, dbo.PAYMENTS.BRANCH, dbo.PAYMENTS.MEMBER_ID, dbo.STUDENTS.FULL_NAME, dbo.STUDENTS.MOBILE, dbo.STUDENTS.EMAIL, dbo.PAYMENTS.STD, 
                         dbo.PAYMENTS.FEE_TYPE, dbo.PAYMENTS.INSTALLMENT, dbo.PAYMENTS.AMOUNT, dbo.PAYMENTS.LATE_FEE_RATE, dbo.PAYMENTS.LATE_FEE_LIMIT, dbo.PAYMENTS.START_DATE, dbo.PAYMENTS.DUE_DATE, 
                         dbo.PAYMENTS.EXPIRY_DATE, dbo.PAYMENTS.REMARKS, ISNULL(TRANSACTIONS.ID, - 1) AS TXID, ISNULL(TRANSACTIONS.TXN_ID, '') AS TXN_ID, ISNULL(TRANSACTIONS.TXN_DATE, '') AS TXN_DATE, 
                         ISNULL(TRANSACTIONS.TOTAL_AMOUNT, dbo.PAYMENTS.AMOUNT + dbo.CalcDue(dbo.PAYMENTS.DUE_DATE, dbo.PAYMENTS.LATE_FEE_RATE, dbo.PAYMENTS.LATE_FEE_LIMIT)) AS TOTAL_AMOUNT, 
                         ISNULL(TRANSACTIONS.TOTAL_LATE_FEE_AMOUNT, dbo.CalcDue(dbo.PAYMENTS.DUE_DATE, dbo.PAYMENTS.LATE_FEE_RATE, dbo.PAYMENTS.LATE_FEE_LIMIT)) AS TOTAL_LATE_FEE_AMOUNT, 
                         ISNULL(TRANSACTIONS.PAYMENT_MODE, '') AS PAYMENT_MODE, ISNULL(TRANSACTIONS.REF_NO, '') AS REF_NO, ISNULL(TRANSACTIONS.REF_DETAILS, '') AS REF_DETAILS, 
                         ISNULL(TRANSACTIONS.TECH_RESPONSE_F1, '') AS TECH_RESPONSE_F1, ISNULL(TRANSACTIONS.TECH_RESPONSE_F2, '') AS TECH_RESPONSE_F2, ISNULL(TRANSACTIONS.REMARKS, '') AS TX_REMARKS, 
                         ISNULL(TRANSACTIONS.STATUS, 'DUE') AS STATUS, ISNULL(TRANSACTIONS.FINANCIAL_INSTITUTE, '') AS FINANCIAL_INSTITUTE, ISNULL(TRANSACTIONS.CREATED_BY, dbo.PAYMENTS.CREATED_BY) 
                         AS TX_CREATED_BY, ISNULL(TRANSACTIONS.CREATED_ON, dbo.PAYMENTS.CREATED_ON) AS TX_CREATED_ON, ISNULL(TRANSACTIONS.MODIFIED_BY, dbo.PAYMENTS.MODIFIED_BY) AS TX_MODIFIED_BY, 
                         ISNULL(TRANSACTIONS.MODIFIED_ON, dbo.PAYMENTS.MODIFIED_ON) AS TX_MODIFIED_ON, dbo.PAYMENTS.CREATED_BY, dbo.PAYMENTS.CREATED_ON, dbo.PAYMENTS.MODIFIED_BY, 
                         dbo.PAYMENTS.MODIFIED_ON , ISNULL(TRANSACTIONS.ERPStatus, '') AS TX_ERPStatus
FROM            dbo.PAYMENTS INNER JOIN
                         dbo.STUDENTS ON dbo.PAYMENTS.MEMBER_ID = dbo.STUDENTS.MEMBER_ID LEFT OUTER JOIN
                         (SELECT * FROM dbo.TRANSACTIONS WHERE STATUS!='REVERSED') AS TRANSACTIONS ON dbo.PAYMENTS.ID = TRANSACTIONS.PAYMENT_ID ;

【问题讨论】:

  • 使用create view创建视图
  • SQL 表示 ms sql server
  • "但在 PostgreSQL 中不起作用,因为有不同的模式" 你为什么认为我们知道你使用的模式名称?您可以在 PostgreSQL 中创建一个模式“dbo”并将其用于所有表。

标签: sql postgresql database-migration sql-view


【解决方案1】:

最后,我得到了解决方案,这就是我在 postgresql 中创建视图的方式。

CREATE or REPLACE VIEW "payment_status" AS  SELECT payments.id,
payments.academic_year,
payments.branch,
payments.member_id,
students.full_name,
students.mobile,
students.email,
payments.std,
payments.fee_type,
payments.installment,
payments.amount,
payments.late_fee_rate,
payments.late_fee_limit,
payments.start_date,
payments.due_date,
payments.expiry_date,
payments.remarks,
COALESCE(transactions.id, ('-1'::integer)::bigint) AS txid,
COALESCE(transactions.txn_id, ''::text) AS txn_id,
COALESCE(transactions.txn_date, (NULL::date)::timestamp with time zone) AS txn_date,
COALESCE(transactions.total_amount, (payments.amount + calc_due((payments.due_date)::date, payments.late_fee_rate, payments.late_fee_limit))) AS total_amount,
COALESCE(transactions.total_late_fee_amount, calc_due((payments.due_date)::date, payments.late_fee_rate, payments.late_fee_limit)) AS total_late_fee_amount,
COALESCE(transactions.payment_mode, ''::text) AS payment_mode,
COALESCE(transactions.ref_no, ''::text) AS ref_no,
COALESCE(transactions.ref_details, ''::text) AS ref_details,
COALESCE(transactions.tech_response_f1, ''::text) AS tech_response_f1,
COALESCE(transactions.tech_response_f2, ''::text) AS tech_response_f2,
COALESCE(transactions.remarks, ''::text) AS tx_remarks,
COALESCE(transactions.status, 'DUE'::text) AS status,
COALESCE(transactions.financial_institute, ''::text) AS financial_institute,
COALESCE(transactions.created_by, payments.created_by) AS tx_created_by,
COALESCE(transactions.created_on, payments.created_on) AS tx_created_on,
COALESCE(transactions.modified_by, payments.modified_by) AS tx_modified_by,
COALESCE(transactions.modified_on, payments.modified_on) AS tx_modified_on,
payments.created_by,
payments.created_on,
payments.modified_by,
payments.modified_on,
COALESCE(transactions.erpstatus, ''::text) AS tx_erpstatus
FROM ((payments
 JOIN students ON ((payments.member_id = students.member_id)))
 LEFT JOIN ( SELECT transactions_1.id,
        transactions_1.txn_id,
        transactions_1.txn_date,
        transactions_1.payment_id,
        transactions_1.total_amount,
        transactions_1.total_late_fee_amount,
        transactions_1.payment_mode,
        transactions_1.ref_no,
        transactions_1.ref_details,
        transactions_1.tech_response_f1,
        transactions_1.tech_response_f2,
        transactions_1.remarks,
        transactions_1.status,
        transactions_1.financial_institute,
        transactions_1.created_by,
        transactions_1.created_on,
        transactions_1.modified_by,
        transactions_1.modified_on,
        transactions_1.erpstatus
       FROM transactions transactions_1
      WHERE (transactions_1.status <> 'REVERSED'::text)) transactions ON ((payments.id = transactions.payment_id))); ;

【讨论】:

  • ('-1'::integer)::bigint 可以简化为-1::bigint(NULL::date)::timestamp with time zone) 可以简化为null::timestamptz'DUE'::text 可以简化为'DUE'`。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2014-01-21
相关资源
最近更新 更多