我正在尝试创建一个包含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。
我有一种模糊的记忆,以前看到类似的问题,但我不能为我的生活找到它。有没有人有任何想法?
非常感谢提前
答案 0 :(得分:1)
我找到了这个问题的解决方案,可能会帮助其他有类似问题的人。
表格123_final
和xyz_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_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;