在 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))); ;
我在 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))); ;