【问题标题】:How to insert a column and it's values from another table without a common field in postgresql?如何在 postgresql 中没有公共字段的情况下从另一个表中插入列及其值?
【发布时间】:2019-12-21 22:17:42
【问题描述】:

我在 postgresql 中有两个表没有一个公共字段。

  • Table1 有一个 TIMESTAMP 字段。
  • Table2 有 FIRST_TIMESTAMP、LAST_TIMESTAMP 和 SEGMENT_ID 字段。

如何根据条件之类的条件将 SEGMENT_ID 字段及其值从 Table2 插入 Table1;

"如果 Table1.TIMESTAMP 在 Table2.FIRST_TIMESTAMP 和 Table2.LAST_TIMESTAMP 之间"

(如果 Table1.TIMESTAMP>=Table2.FIRST_TIMESTAMP AND Table1.TIMESTAMP

答案也可以包括 postgresql UPDATE 语句而不是 INSERT 语句。

感谢您的帮助。

【问题讨论】:

  • Table1 中是否也有 SEGMENT_ID 列?
  • 不,表中没有公共字段。
  • 那么Table1的哪一列会被更新?
  • 我可以在更新语句之前向 Table1 添加一个 SEGMENT_ID 字段。表 1 中的 SEGMENT_ID 字段将根据条件填充。
  • 因此,在将 segment_id 字段添加到 Table1 之后,您想要执行类似 MERGE(又名 upsert)表 2 范围内的所有日期 + segment_id 到 Table1 中的操作?

标签: sql postgresql sql-update sql-insert


【解决方案1】:

这是连接的语法,条件是table1的时间戳必须在postgresql的table2的2个时间戳之间:

update table1 t1
set segment_id = t2.segment_id
from table2 t2
where t1.timestamp between t2.first_timestamp and t2.last_timestamp

【讨论】:

  • 我收到以下错误; “错误:关系“table2”不存在第 3 行:来自 table2 t2 SQL 状态:42P01”
  • 这是一个简化的演示:dbfiddle.uk/… 如您所见,它在语法上是正确的。
  • 您是否将表的名称更改为您拥有的实际名称?
  • 是的,我已更改为实际的表名。您的 dbfiddle 链接似乎正是我想要的,但我仍然收到此错误。
  • 报错说没有table2。你确定这个表存在还是你拼错了?
【解决方案2】:

我认为您正在寻找这样的东西:

INSERT INTO table1 (segment_id, col1, col2, ...)
SELECT segment_id, col1, col2, ... FROM table2 WHERE <where_condition>;

请注意,如果您是INSERTing,则不存在现有的table1.timestamp,因此您无法将其与table2 进行比较,因此您需要提供一个不同的where_condition

对于UPDATE

UPDATE table1
   SET col1 = table2.segment_id
  FROM table2
 WHERE table1.timestamp_col BETWEEN table2.first_timestamp AND table2.last_timestamp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多