使用SELECT语句填充列 - 格式化问题

时间:2015-12-02 13:44:24

标签: postgresql select sql-insert

我正在尝试创建一个包含2列的新表。目的是在一个Postgres表上用SELECT语句填充第一列,然后在另一个Postgres表上用另一个SELECT语句填充第二列。

我想要实现的一般化版本是:

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。

我有一种模糊的记忆,以前看到类似的问题,但我不能为我的生活找到它。有没有人有任何想法?

非常感谢提前

2 个答案:

答案 0 :(得分:1)

我找到了这个问题的解决方案,可能会帮助其他有类似问题的人。

表格123_finalxyz_final都来自同一来源csv,因此具有相同的行顺序。

通过向每个表添加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,但它产生了理想的结果,没有我之前看到的奇怪的格式问题。如果有人有替代方案,更好的解决方案,那么请发布它,因为它将帮助我提高我的SQL技能,这总是一个加号!

PS。我对回答你自己的问题的礼仪并不是百分之百确定 - 我找到了一种让我理解并将来会再次使用的方法。如果您不想回答自己的问题,那么我会将其更改为评论。

由于

答案 1 :(得分:0)

您必须将插入行的值视为一个。由于您未在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;