【问题标题】:PostgreSQL Function/Pivot/Join?PostgreSQL 函数/枢轴/连接?
【发布时间】:2014-07-11 13:11:29
【问题描述】:

我的数据库中目前有三个表:

tablename: r 有 800k 条记录

r_key text, name varchar, l_key varchar[]
a1, high street, [r1,r2,r3]
a2, a123, [r1,r2,r3]
a3, orchard street, r4
a4, thomas lane, [r5,r6]

表名:l 有 400 万条记录

l_key text, 
r1
r2
r3
r4
r5
r6

然后我有一个看起来像这样的查找表,其中包含 3.6mill 记录

r_key text, l_key text
a1, r1
a1, r2
a1, r3
a2, r1
a2, r2
a2, r3
a3, r4
a4, r5
a4, r6

我追求的是一个看起来像的新表

l_key, name, number*
r1, high street, a123
r2, high street, a123
r3, high street, a123
r4, orchard street, NULL
r5, thomas lane, NULL
r6, thomas lane, NULL 

*数字将来自对名称字段执行正则表达式以查找包含数字的任何值

我尝试过使用更新语句:

UPDATE l SET 
name = (SELECT name 
FROM lookup
INNER JOIN r
ON lookup.r_key = r.r_key
INNER JOIN l
ON lookup.l_key = l_l_key);

但是选择返回多条记录,所以我得到了这个错误

ERROR: more than one row returned by a subquery used as an expression

然后我尝试使用两个光标编写一个函数来查看不同的键并应用更新,但这已经运行了几个小时,我认为它不会起作用。

我做了一些研究,有一个支点,但不确定它是否适用于这种情况。

附加:Windows 7 PostgreSQL 9.3

【问题讨论】:

    标签: sql regex postgresql


    【解决方案1】:

    使用limit 子句

    UPDATE l SET 
    name = (
        SELECT name 
        FROM
            lookup
            INNER JOIN r ON lookup.r_key = r.r_key
            INNER JOIN l ON lookup.l_key = l_l_key
        limit 1
    );
    

    http://www.postgresql.org/docs/current/static/sql-select.html#SQL-LIMIT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2020-12-27
      • 2016-12-27
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多