我有一个PostgreSQL表:
表-A
id, start_date, tracking_date, type, relationship_id
基本上,我试图删除tracking_date列并保留数据,为每个记录创建一个非空跟踪日期的新记录。新记录应该是原始记录的副本,除了start_date应该是原始行的tracking_date的值,新的tracking_date应该是NULL,最后类型应该是字符串值" type_b&# 34;对于以这种方式修改的所有记录。
到目前为止,我的查询是:
INSERT INTO table_a
(id, start_date, tracking_date, type, relationship_id)
SELECT (id, start_date, NULL, "type_b", relationship_id)
FROM table_a
WHERE tracking_date IS NOT NULL;
我不认为选择NULL和/或字符串值" type_b"来自table_a是有效的。我想知道如何使用INSERT INTO SELECT FROM查询结构来插入另一个表中的值以及同一查询中的NULL和字符串值。 (或在多个查询中)
在
table_a
id, start_date, tracking_date, type, relationship_id
1, 1/1/1999, NULL, type_a, 100
1, 1/2/1999, 1/3/1999, type_a, 100
在
table_a
id, start_date, tracking_date, type, relationship_id
1, 1/1/1999, NULL, type_a, 100
1, 1/2/1999, 1/3/1999, type_a, 100
1, 1/3/1999, NULL, type_b, 100
(我的想法是,之后我会删除tracking_date列))
答案 0 :(得分:0)
我假设您的tracking_date字段被定义为时间戳。在这种情况下,请尝试以下方法如果这不起作用,你得到的错误是什么?
INSERT INTO table_a
(id, start_date, tracking_date, type, relationship_id)
SELECT
(id, start_date, NULL::timestamp, "type_b", relationship_id)
FROM table_a
WHERE tracking_date IS NOT NULL;
答案 1 :(得分:0)
您必须删除select
中列列表周围的括号。
(id, start_date, NULL, "type_b", relationship_id)
是具有匿名记录类型的单个列。
有关详细信息,请参阅手册:Row Constructors
此外:字符串必须放在单个引号之间。双引号("
)用于标识符。 "type_b"
是列的名称,'type_b'
是字符串。
有关详细信息,请参阅手册:Constants
所以查询应该是:
INSERT INTO table_a (id, start_date, tracking_date, type, relationship_id)
SELECT id, start_date, NULL, 'type_b', relationship_id
FROM table_a
WHERE tracking_date IS NOT NULL;