【问题标题】:PostgreSQL INSERT FROM SELECT with additional column带有附加列的 PostgreSQL INSERT FROM SELECT
【发布时间】:2016-04-27 07:13:35
【问题描述】:

我在数据库DB1 中有表T1,在数据库DB2 中有表T2,这些表具有几乎相同的列集,除了T1 中的列C_additional,@987654327 中不存在@。我需要将所有行从T2 转移到T1,为我插入的每一行设置一些C_additional 的值。例如:T1T2 只有一列 C1 类型为 integerT1 也有列 C_additional 类型为 text,所以我的代码如下所示:

INSERT INTO T1
SELECT 
        C1,
        C_additional='needed_value'
FROM dblink(
    'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
    'SELECT * FROM T2')
AS T2_row(C1 integer)

我收到以下错误:

ERROR: column "C_additional" does not exist
SQL state: 42703
Hint: There is a column named "C_additional" in table "T1", but it cannot be referenced from this part of the query.

如何使用 SQL 进行数据传输,还是应该使用 PG/SQL?

【问题讨论】:

  • 向我们展示 t1 和 t2 的定义。
  • C_additional='needed_value' 是一个布尔表达式,用于评估列名 C_additional 是否等于常量 'needed_value'。如果您想要一个列别名,请使用一个:'needed_value' as c_additional

标签: sql postgresql sql-insert


【解决方案1】:

您可以在select 子句之前用括号指定目标列:

INSERT INTO T1
(c1, c_additional) -- here
SELECT 
        C1,
        'needed_value' -- just select a constant here
FROM dblink(
    'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
    'SELECT * FROM T2')
AS T2_row(C1 integer) 

【讨论】:

    【解决方案2】:

    你可以试试这个吗?

    INSERT INTO T1
    SELECT 
            C1,
            'needed_value'
    FROM dblink(
        'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
        'SELECT * FROM T2')
    AS T2_row(C1 integer)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2010-12-19
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多