2016-01-20 75 views
0

我目前正在运行2个表格:一个是活动的,另一个是第一个表格。以上代码使用登台表作为源更新活动表中的值。它只更新列“firstname”中的值,如果stage表中的行已经存在于实时表和其他一些简单条件中。Postgresql更新声明

Update LiveTable 
    SET LiveTable.firstname = TestTable.firstname 
FROM TestTable 
    WHERE EXISTS (SELECT 1 FROM LiveTable WHERE LiveTable.userid = TestTable.userid) 
    AND TestTable.firstname IS NOT NULL 
    AND LEN(TestTable.firstname) > len(LiveTable.firstname); 

上面的代码喷射工作完成,但需要相当一段时间。我想知道是否有更快的方法来做到这一点。

我试图创建FUNCTION做同样的事情,但无法让它工作。

+0

试试'where livetable.userid = testtable.userid'而不是'where exists exists(...)' –

回答

1

使用两个表

Update LiveTable 
    SET LiveTable.firstname = TestTable.firstname 
FROM TestTable 
WHERE LiveTable.userid = TestTable.userid 
    AND TestTable.firstname IS NOT NULL 
    AND length(TestTable.firstname) > len(LiveTable.firstname); 

条件是不是真的需要TestTable.firstname IS NOT NULL因为length(TestTable.firstname) > len(LiveTable.firstname)会过滤掉行,其中firstname为空反正之间的联接。它应该是length()而不是len()

+0

非常感谢@a_horse_with_no_name它确实花了我一些时间来测试这一点,但它完成了我想要的工作它。过去需要几个小时的东西不需要几分钟。有没有理由为什么这个位比常规的'WHERE EXISTS(SELECT 1 from ...)'语句快得多?与使用'WHERE EXISTS(SELECT 1 from ...)'相比,对结果的稳定性/可靠性是否有任何影响? –

+0

@ Sky21.86:如果'TestTable.userid'没有编入索引,'exist'共同相关的子查询将在'livetable'中的每一行执行一次,这将非常昂贵。连接只读取一次表格(尽管可能来自'testtable'的所有行)。一次处理多行数据通常比逐行处理更快。但是你需要检查[执行计划](http://www.postgresql.org/docs/current/static/sql-explain.html)来验证这一点。 –