使用 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_finalxyz_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_finalxyz_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% 确定回答你自己的问题的礼节 - 我找到了一种我理解并愿意让这个工作正常进行的方法以后再用。如果您不想回答自己的问题,那么我会将其更改为评论。

谢谢