【问题标题】:Populating Columns Using SELECT Statements - Formatting Issue使用 SELECT 语句填充列 - 格式问题
【发布时间】:2016-03-06 18:50:51
【问题描述】:

我正在尝试创建一个包含 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 填充。 p>

我对以前看到过类似的问题有一个模糊的记忆,但我一辈子都找不到它。有人有什么想法吗?

在此先感谢

【问题讨论】:

  • 您必须将插入行中的值视为一个

标签: postgresql select sql-insert


【解决方案1】:

我想出了一个解决这个问题的方法,可能会帮助遇到类似问题的其他人。

说表 123_final 和 xyz_final 都是从同一源 csv 生成的,因此具有相同的行顺序。

通过向每个表添加serial 属性,然后可以基于serialattribute 进行连接:

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。我不能 100% 确定回答您自己的问题的礼仪 - 我找到了一种我理解的方法来完成这项工作,并将在未来再次使用。如果您不打算回答自己的问题,那么我会将其更改为评论。

谢谢

【讨论】:

  • 回答你自己的问题完全没问题。动机就像你说的——帮助别人。抱歉,当您在 2 月份写上一条评论时,我无法为您提供帮助。
【解决方案2】:

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

【讨论】:

  • @Gabriel's_Messanger - 真的很抱歉,我才意识到我从来没有回复过这个 - 抱歉,这是一种糟糕的形式!老实说,我不完全理解你的回答。我知道你是说我需要告诉 Postgres 我选择的 2 个表是如何相关的,但是我一直到最后有点困惑。我已经尝试了很多关于你所说的变化,只是无法使它起作用。当我试图复制这个空白时,您是否有另一个通过示例甚至是自己谷歌的短语?如果没有,请不要担心,我知道这是一个旧帖子了。非常感谢
猜你喜欢
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2023-04-11
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多