【问题标题】:PostgreSQL Table mergePostgreSQL 表合并
【发布时间】:2012-11-21 14:40:03
【问题描述】:

例如,我有两个数据表:

网络状态

ipaddress       time       violation
192.168.1.1     2:00       yes
192.168.1.6     2:00       no
192.168.1.11    2:00       no
192.168.1.1     3:00       no
192.168.1.6     3:00       no
192.168.1.11    3:00       yes

防火墙日志

ipaddress       machinetype    location
192.168.1.1     computer       London
192.168.1.6     server         New York
192.168.1.11    server         Bejing

我希望将防火墙日志中的数据合并到网络状态表中,以便获得以下信息:

网络状态

ipaddress       time       violation       machinetype       location
192.168.1.1     2:00       yes             computer          London
192.168.1.6     2:00       no              server            New York
192.168.1.11    2:00       no              server            Bejing
192.168.1.1     3:00       no              computer          London
192.168.1.6     3:00       no              server            New York
192.168.1.11    3:00       yes             server            Bejing

有人有什么想法吗?我假设会有一个命令通过特定的列值合并表,但经过研究,我只遇到了 join 和 select into 命令。但我不知道如何使用这些来实现我想要的。

谢谢!

【问题讨论】:

  • UNION 不起作用,不同的列数

标签: sql postgresql


【解决方案1】:

您如何看待视图?将两个表与一个 select 组合并从中创建一个视图

CREATE VIEW myView AS SELECT log.*,status.* FROM log, status 
WHERE log.ipaddress=status.ipaddress 

/* OR */
CREATE VIEW myView AS SELECT log.*,status.* FROM log l
INNER JOIN status s ON l.ipaddress=s.ipaddress

【讨论】:

  • 请使用显式的JOIN 语法,而不是where 子句中的隐式连接。
  • 你是对的......我的错误,通常我只使用带有数字列的连接子句,但字符也可以。
  • 也永远不要使用*table_name.*。它可能会导致一些令人讨厌的错误,并且在这个特定的 VIEW 中它将重复 ipaddress
  • 谢谢,我选择使用添加列,更新方法,因为创建视图方法占用了大量内存(我正在尝试将包含 2.7m 条数据的防火墙日志与包含的网络状态合并168m条数据),更新方式不需要为每一行分配新的内存……我也比较容易理解。
【解决方案2】:

要“合并”您需要的这些表:

1) 将“机器类型”和“位置”列添加到“网络状态”表中:

ALTER TABLE "Network Status"
  ADD COLUMN "machinetype" TEXT;
ALTER TABLE "Network Status"
  ADD COLUMN "location" TEXT;

2) 用数据填充它们

UPDATE "Network Status" NS
SET "machinetype" = FL."machinetype",
    "location" = FL."location"
FROM "Firewall Log" FL
WHERE FL."ipaddress" = NS."ipaddress"

或者您可以创建一个VIEW 并将其用于SELECT 数据,就像它是一个表一样:

CREATE VIEW "Status and log" AS
SELECT NS."ipaddress", NS."time", NS."violation", FL."machinetype", FL."location"
FROM "Network Status" NS
JOIN "Firewall Log" FL ON FL."ipaddress" = NS."ipaddress"

【讨论】:

  • 谢谢,完美运行 :) 请参阅上面的评论,了解我选择使用添加列/更新方法的原因。
猜你喜欢
  • 2017-11-17
  • 2012-08-19
  • 2018-12-23
  • 2022-01-26
  • 2015-02-25
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多