我正在使用 postgreSQL 对数据库进行排序。当我调用该查询时,我遇到了一个简单的问题,我试图为我们的许多人解决这个问题,但它仍然不起作用。 我正在尝试将一张表拆分为许多不同的表。
ALTER TABLE table
ADD COLUMN nationality TEXT,
ADD COLUMN place_of_birth TEXT,
ADD COLUMN date_of_birth INTEGER,
ADD COLUMN date_of_death INTEGER;
-- perform update
-- part which is not working
WITH splitted_data AS (
SELECT
title,
s [1] AS nationality,
s [4] AS place_of_birth,
s [5] AS date_of_birth,
s [6] AS date_of_death,
object_id
FROM
table,
regexp_matches(table.artist_bio, '\(([^),]+),?\s?(born )?(([^\.]+)\.? )?(\d{4})?(\d{4})?\)') s
)
UPDATE table
SET
nationality = new_values.nationality,
place_of_birth = new_values.place_of_birth,
date_of_birth = new_values.date_of_birth :: INTEGER,
date_of_death = new_values.date_of_death :: INTEGER
FROM (
SELECT
nationality,
place_of_birth,
date_of_birth,
date_of_death,
object_id
FROM splitted_data
) AS new_values
WHERE table.object_id = new_values.object_id;
--until here
ALTER TABLE table
DROP artist_bio;
地点:
标题是包含标题的其他列
artist_bio是一个VARCHAR,包含要分割的信息
这是表格的一小部分:http://wklej.org/hash/3a2f6f17d20/
感谢您的帮助!
最佳答案
我相信问题出在这个子查询上:
SELECT title,
s[1] AS nationality,
s[4] AS place_of_birth,
s[5] AS date_of_birth,
s[6] AS date_of_death,
object_id
FROM table,
regexp_matches(table.artist_bio, '\(([^),]+),?\s?(born )?(([^\.]+)\.? )?(\d{4})?(\d{4})?\)') s
我认为您只需使用 regexp_matches()
返回子查询中的列即可完成您想要的操作:
SELECT title,
s[1] AS nationality,
s[4] AS place_of_birth,
s[5] AS date_of_birth,
s[6] AS date_of_death,
object_id
FROM (SELECT t.*,
regexp_matches(table.artist_bio, '\(([^),]+),?\s?(born )?(([^\.]+)\.? )?(\d{4})?(\d{4})?\)') as s
FROM table t
) t
关于sql - PostgreSQL 错误 : function expression in FROM cannot refer to other relations of same query level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35524757/