我有一个数据库表,我需要运行UPDATE语句。这个表格有大约250,000条记录,所以优化的性能很重要。帮助处理复杂的SQL UPDATE语句
这里是相关的数据库模式和一些示例数据。
audit_logs -- id -- ticket_id -- ip_address -- created_at -- -- 10 -- 100 -- 100.101.102.103 -- 2014-08-22 11:17:28.325844 -- -- 11 -- 100 -- 100.101.102.103 -- 2014-08-23 12:18:28.325844 -- -- 12 -- 101 -- 200.1.2.3 -- 2014-08-24 13:19:28.325844 -- -- 13 -- 101 -- 201.2.3.4 -- 2014-08-25 14:20:28.325844 -- -- 14 - 101 -- 202.3.4.5 -- 2014-08-26 15:21:28.325844 -- -- 15 - 102 -- 102.12.34.56 -- 2014-08-27 16:22:28.325844 --
这是我需要做的。对于任何具有超过1个IP地址的记录的ticket_id,我需要将除第一个IP地址以外的每个IP地址的ticket_id设置为NULL。以上是上述数据的示例结果。
audit_logs -- id -- ticket_id -- ip_address -- created_at -- -- 10 -- 100 -- 100.101.102.103 -- 2014-08-22 11:17:28.325844 -- -- 11 -- 100 -- 100.101.102.103 -- 2014-08-23 12:18:28.325844 -- -- 12 -- 101 -- 200.1.2.3 -- 2014-08-24 13:19:28.325844 -- -- 13 -- NULL -- 201.2.3.4 -- 2014-08-25 14:20:28.325844 -- -- 14 - NULL -- 202.3.4.5 -- 2014-08-26 15:21:28.325844 -- -- 15 - 102 -- 102.12.34.56 -- 2014-08-27 16:22:28.325844 --
因此,可以有多张记录具有相同的票据。但是,如果有一个以上的IP地址与一张票相关联,则每个带有除第一个IP地址以外的IP地址的记录都需要清空。
我正在使用的实际RDBMS是Postgres。最简单的方法是什么?谢谢大家。
如何确定哪一行是'第一';创建日期? – sirlark 2014-08-29 21:52:23
它可能是两件事之一。给定ticket_id的最小'created_at'时间或最小的'id'值。两者订购应产生相同的结果。 – WhiteWulfTech 2014-08-29 22:02:43
不,记录11的ticket_id不应该为空,因为记录10和11的IP地址值是相同的。我只想在IP地址不同时清空票据。 – WhiteWulfTech 2014-08-29 22:03:26