使用 SELECT 语句填充列 - 格式问题
Populating Columns Using SELECT Statements - Formatting Issue
我正在尝试创建一个包含 2 列的新 table。目的是在一个 Postgres table 上用 SELECT
语句填充第一列,然后在另一个 Postgres table.[= 上用另一个 SELECT
语句填充第二列。 14=]
我想要实现的通用版本是:
CREATE TABLE test_db_021215(
a_hashed_email VARCHAR,
b_hashed_emailaddress VARCHAR);
INSERT INTO test_db_021215(a_hashed_email)
SELECT hashed_email FROM 123_final;
INSERT INTO test_db_021215(b_hashed_emailaddress)
SELECT hashed_emailadress FROM xyz_final;
ALTER TABLE test_db_021215
ADD COLUMN urn SERIAL NOT NULL PRIMARY KEY;
ANALYZE test_db_021215;
问题是虽然上面的查询确实填充了列,但格式很奇怪:
说属性 a_hashed_email 完全填充了 500 条记录,然后属性 b_hashed_emailaddress(也说有 500 条记录)在记录 1 - 500 中为空白,但随后从 501 - 1000 开始填充。
所以我最终得到 a_hashed_email 填充从 1 - 500 和空白从 501 - 1000 和 b_hashed_emailaddress 1 - 500 为空,501 - 1000 为空。
我模糊地记得以前看到过类似的问题,但我这辈子都找不到了。有人有什么想法吗?
非常感谢
您必须将插入行的值视为一个值。由于您没有显示 123_final
和 xyz_final
之间的任何关系,并且您尝试以 SELECT
输出的默认顺序分别插入它们,我提出了满足该标准的解决方案:
INSERT INTO test_db_021215(a_hashed_email, b_hashed_emailaddress)
SELECT hashed_email, hashed_emailadress
FROM
(SELECT row_number() over() as num, hashed_email
FROM 123_final ) as s1
FULL OUTER JOIN (
SELECT row_number() over() as num, hashed_emailadress
FROM xyz_final
) as s2 ON s1.num = s2.num;
我找到了这个问题的解决方案,可能会对遇到类似问题的其他人有所帮助。
说 tables 123_final
和 xyz_final
都是从相同的来源 csv
生成的,因此具有相同的行顺序。
通过向每个 table 添加 serial
属性,然后可以根据 serial
属性进行连接:
COPY( SELECT * FROM 123_final, xyz_final WHERE 123_serial = xyz_serial )
TO '/Users/Shared/123_xyz_joined_table_all_component_attributes_180216.csv'
(FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
我知道可能有更好的方法来实现这一点,这是执行 JOIN
的一种非常基本的方法,但它产生了预期的结果,没有我之前看到的奇怪的格式问题.如果有人有更好的替代解决方案,请 post 它会帮助我提高我的 SQL 技能,这总是一个加分项!
PS. 我不是 100% 确定回答你自己的问题的礼节 - 我找到了一种我理解并愿意让这个工作正常进行的方法以后再用。如果您不想回答自己的问题,那么我会将其更改为评论。
谢谢
我正在尝试创建一个包含 2 列的新 table。目的是在一个 Postgres table 上用 SELECT
语句填充第一列,然后在另一个 Postgres table.[= 上用另一个 SELECT
语句填充第二列。 14=]
我想要实现的通用版本是:
CREATE TABLE test_db_021215(
a_hashed_email VARCHAR,
b_hashed_emailaddress VARCHAR);
INSERT INTO test_db_021215(a_hashed_email)
SELECT hashed_email FROM 123_final;
INSERT INTO test_db_021215(b_hashed_emailaddress)
SELECT hashed_emailadress FROM xyz_final;
ALTER TABLE test_db_021215
ADD COLUMN urn SERIAL NOT NULL PRIMARY KEY;
ANALYZE test_db_021215;
问题是虽然上面的查询确实填充了列,但格式很奇怪:
说属性 a_hashed_email 完全填充了 500 条记录,然后属性 b_hashed_emailaddress(也说有 500 条记录)在记录 1 - 500 中为空白,但随后从 501 - 1000 开始填充。
所以我最终得到 a_hashed_email 填充从 1 - 500 和空白从 501 - 1000 和 b_hashed_emailaddress 1 - 500 为空,501 - 1000 为空。
我模糊地记得以前看到过类似的问题,但我这辈子都找不到了。有人有什么想法吗?
非常感谢
您必须将插入行的值视为一个值。由于您没有显示 123_final
和 xyz_final
之间的任何关系,并且您尝试以 SELECT
输出的默认顺序分别插入它们,我提出了满足该标准的解决方案:
INSERT INTO test_db_021215(a_hashed_email, b_hashed_emailaddress)
SELECT hashed_email, hashed_emailadress
FROM
(SELECT row_number() over() as num, hashed_email
FROM 123_final ) as s1
FULL OUTER JOIN (
SELECT row_number() over() as num, hashed_emailadress
FROM xyz_final
) as s2 ON s1.num = s2.num;
我找到了这个问题的解决方案,可能会对遇到类似问题的其他人有所帮助。
说 tables 123_final
和 xyz_final
都是从相同的来源 csv
生成的,因此具有相同的行顺序。
通过向每个 table 添加 serial
属性,然后可以根据 serial
属性进行连接:
COPY( SELECT * FROM 123_final, xyz_final WHERE 123_serial = xyz_serial )
TO '/Users/Shared/123_xyz_joined_table_all_component_attributes_180216.csv'
(FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
我知道可能有更好的方法来实现这一点,这是执行 JOIN
的一种非常基本的方法,但它产生了预期的结果,没有我之前看到的奇怪的格式问题.如果有人有更好的替代解决方案,请 post 它会帮助我提高我的 SQL 技能,这总是一个加分项!
PS. 我不是 100% 确定回答你自己的问题的礼节 - 我找到了一种我理解并愿意让这个工作正常进行的方法以后再用。如果您不想回答自己的问题,那么我会将其更改为评论。
谢谢