在 postgresql 中创建视图

create view in postgresql

我在 PostgreSQL 数据库中有几个表和两个函数。 我将 SQL 服务器数据库迁移到 PostgreSQL 数据库。 现在,我想创建一个从多个表中获取数据的视图。 这在 SQL 服务器中工作正常,但在 PostgreSQL 中不起作用,因为具有不同的模式和语法。 有谁知道如何在 PostgreSQL 中创建视图? 如何将 SQL 服务器视图转换为 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 ;

最后,我得到了解决方案,这就是我在 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))); ;