1

我正在尝试使用REGEXP_SUBSTR更新表中的列,但出现错误,缺少表达式。

UPDATE p_table SET f_name = SELECT REGEXP_SUBSTR ( (SELECT user_name
                          FROM user_info
                         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1)
            FROM DUAL;

当我在第一次选择之前和双重之后添加括号时,它可以工作,但将该列中的所有行设置为相同的值。我不需要它们都是独一无二的,但我不能让它们都一样。谢谢你能给我的任何建议。

UPDATE p_table SET f_name = (SELECT REGEXP_SUBSTR ( (SELECT user_name
                          FROM user_info
                         WHERE ROWID = R_ID ('user_info')), '[^ ]{1,15}', 1, 1) 
            FROM DUAL);
4

2 回答 2

3

正如@PatrickMarchand 评论中提到的Oracle 优化查询,所以你的函数只调用一次。AskTom 文章说得很清楚。

要获得解决方法,您必须将链接到 p_table 行的内容引入函数参数中,以强制 Oracle 为每一行调用它。例如rowid来自p_table

UPDATE p_table 
SET f_name = (
      SELECT 
        REGEXP_SUBSTR( 
          ( SELECT user_name FROM user_info
            WHERE ROWID = R_ID ('user_info', p_table.rowid)
          ), 
          '[^ ]{1,15}', 1, 1
        ) 
      FROM DUAL
    )

SQLFiddle 示例

于 2013-08-20T05:23:55.797 回答
0

没有子查询它会做你想做的事吗?

UPDATE p_table
    SET f_name = (SELECT REGEXP_SUBSTR(user_name, '[^ ]{1,15}', 1, 1)
                  FROM user_info
                  WHERE ROWID = R_ID ('user_info')
                 );
于 2013-08-19T21:49:20.753 回答