在MySql中使用group_concat和update语句

2w2cym1i  于 2023-01-29  发布在  Mysql
关注(0)|答案(2)|浏览(158)

我尝试使用GROUP_CONCAT执行以下更新查询,但失败。
任何人都可以帮助我纠正它,此外,语句必须始终以"更新"关键字开始,这也是这里的陷阱。

UPDATE firstEntry f, 
       objects o, 
       titlement_values e 
SET e.customattribute12 = (
    SELECT GROUP_CONCAT(DISTINCT o.minvalue) 
    WHERE f.ldkey = o.ld_key 
      AND o.TITLE_VALUEKEY = e.TITLE_VALUEKEY 
      AND e.TITLE_VALUE = 'ZD%' 
      AND f.ldkey = 13 
      AND e.TITLEMENTTYPEKEY = 13 
    GROUP BY e.title_value)

我也尝试执行下面的查询,但也没有成功:

UPDATE firstEntry f, 
       objects o, 
       titlement_values e 
SET e.customattribute12 = minval 
FROM (SELECT GROUP_CONCAT(DISTINCT o.minvalue) AS minval, 
             e.title_value 
      WHERE f.ldkey = o.ld_key 
        AND o.TITLE_VALUEKEY = e.TITLE_VALUEKEY 
        AND e.TITLE_VALUE = 'ZD%' 
        AND f.ldkey = 13 
        AND e.TITLEMENTTYPEKEY = 13 
      GROUP BY e.title_value)

下面是使用select语句连接查询中提到的3个表的表结果
| 组连接|即所有权价值|
| - ------|- ------|
| A1、A2、A3|Zd_A|
| A1、B2|Zd_B|
现在,我需要获取group_concat的值,并在列e.customattribute12中更新它,如下所示
| 即所有权价值|e.customattribute12|
| - ------|- ------|
| zd_A|A1、A2、A3|
| zd_B|A1、B2|

68bkxrlz

68bkxrlz1#

由于MySQL不支持UPDATE语句中的FROM子句,因此您需要重写更新:一个相关子查询就可以完成这个任务,因为它只返回一个标量值。
此外,JOIN操作已经存在了30年,并且是既定的标准,您也应该切换到它。
你在评论中提到的问题。
mjava.sql.BatchUpdateException:不能在FROM子句中指定要更新的目标表'e
它是MySQL错误1063
MySQL不喜欢更新后的表在某个地方被再次使用,我们可以通过下面的技巧来避免,因为我们强制MySql生成一个新的临时表

UPDATE titlement_values e 
SET 
    e.customattribute12 = (SELECT 
            GROUP_CONCAT(DISTINCT o.minvalue)
        FROM
            firstEntry f
                INNER JOIN
            objects o ON f.ldkey = o.ld_key
                INNER JOIN
            (SELECT * FROM titlement_values) e1 ON o.TITLE_VALUEKEY = e1.TITLE_VALUEKEY
        WHERE
            e1.TITLE_VALUE LIKE 'ZD%' AND f.ldkey = 13
                AND e1.TITLEMENTTYPEKEY = 13
                AND e1.title_value = e.title_value)
vfhzx4xs

vfhzx4xs2#

一旦您能够确保子查询正常工作,请尝试在要更新的表和精心编制的子查询之间应用连接,以匹配“title_value”值。

UPDATE titlement_values
INNER JOIN (SELECT GROUP_CONCAT(DISTINCT o.minvalue) AS minval, 
                   e.title_value 
            FROM       firstEntry       f
            INNER JOIN objects          o ON f.ldkey = o.ld_key
            INNER JOIN titlement_values e ON o.TITLE_VALUEKEY = e.TITLE_VALUEKEY 
            WHERE e.TITLE_VALUE LIKE 'ZD%' 
              AND f.ldkey = 13 
              AND e.TITLEMENTTYPEKEY = 13 ) cte
        ON titlement_values.title_value = cte.title_value
SET customattribute12 = cte.minval

相关问题