如何在Postgres中为表格中的虚拟列创建数据库链接?

时间:2019-02-12 00:04:14

标签: postgresql postgresql-9.5 dblink

我有一个使用dblink的Oracle查询,如下所示

SELECT * FROM  SSP2_PCAT.PRODUCT_TYPES WHERE ( PRODUCT_TYPE) IN 
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
MINUS
SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES@FPORDDEV);

现在,我使用dblink如下将其转换为Postgres,

SELECT * FROM  SSP2_PCAT.PRODUCT_TYPES WHERE (PRODUCT_TYPE) IN 
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
EXCEPT 
SELECT * from dblink 
('dbname=NTE5OFF port=5432 host=xxxxx 
  user=yyyyy password=zzzzz','SELECT PRODUCT_TYPE FROM 
  SSP2_PCAT.PRODUCT_TYPES')
as t (PRODUCT_TYPE character varying(60)) );

现在这绝对正常!

现在,如何将下面相同的带有虚拟列的Oracle sql转换如下,

SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT 
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS@FPORDDEV;

我按以下方式尝试了Postgres中的代码,但显然在给定虚拟列的情况下它抛出了错误,

SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM 
SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT 
SELECT * FROM dblink 
('dbname=NTE5OFF port=5432 host=xxxxx 
user=yyyyy password=zzzzz', 
'SELECT FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM 
SSP2_PCAT.ACCT_LVL_SALES_CDS')
as t ( FRM varchar,
   sales_cd character varying(15),
       sales_code_desc character varying(150),
       active_ind character varying(3) ) );

如果我在这里丢失了任何东西,有人可以让我知道吗?

1 个答案:

答案 0 :(得分:0)

您必须

SELECT 'ITO' FRM ...

在dblink查询中,但是由于它在字符串中,因此您必须将单引号加倍以使其转义:

'SELECT ''ITO'' FRM ...'

但是将外部表与postgres_fdw一起使用会更加简单。