尝试使用mysql更新其他表中的列

时间:2019-06-27 21:55:35

标签: mysql

我通过此查询获取1000条数据记录:

SELECT
     RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) enc, mo.src_ip, mo.datacenter
FROM
    logical_service ls, mpeg_out mo, UNNEST(ls.tags) AS tagarr
WHERE
    tagarr LIKE 'encoder:%'
    AND mo.lid = ls.lid

这将创建3列数据,如下所示:

encoder | src_ip | datacenter

然后我有一个encoder表,其中包含字段

encoder | output_source_ip | datacenter

output_source_ip主要为null,因此如果编码器和数据中心上的选择与编码器和数据中心匹配,我想用src_ip更新encoder表上的该列。

有人知道我该怎么做吗?这是我尝试执行的操作,但肯定已失败:

UPDATE encoder 
    SET output_source_ip = (
SELECT
     RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) encoder, mo.src_ip, mo.datacenter
FROM
    logical_service ls, mpeg_out mo, UNNEST(ls.tags) AS tagarr
WHERE
    tagarr LIKE 'encoder:%'
    AND mo.lid = ls.lid
);

2 个答案:

答案 0 :(得分:4)

在此情况下,我将使用WITH语句使内容看起来更简洁

WITH 
source_data as (
SELECT
     RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) enc, mo.src_ip, mo.datacenter
FROM
    logical_service ls, mpeg_out mo, UNNEST(ls.tags) AS tagarr
WHERE
    tagarr LIKE 'encoder:%'
    AND mo.lid = ls.lid )

UPDATE encoder as en
    SET output_source_ip = (
    select src_ip from source_data as sd
    where sd.datacenter = en.datacenter and sd.encoder = en.encoder
)

那应该为您完成工作

答案 1 :(得分:2)

一种方法是利用Derived Table(子查询)来获取src_ip的值,然后JOINencoder上的datacenter表中,然后encoder个字段;并更新值(如果有匹配项)。

此外,请不要使用基于旧逗号的隐式联接,而不要使用现代Explicit Join based syntax。我已将您的SELECT查询更改为使用显式JOIN .. ON语法。

UPDATE encoder AS e 
JOIN 
(
  SELECT
    RIGHT(tagarr, LENGTH(tagarr) - LENGTH('encoder:')) AS encoder, 
    mo.src_ip, 
    mo.datacenter
  FROM
    logical_service AS ls 
    JOIN mpeg_out AS mo ON mo.lid = ls.lid 
    JOIN UNNEST(ls.tags) AS tagarr ON tagarr LIKE 'encoder:%'
) AS dt ON dt.encoder = e.encoder 
           AND dt.datacenter = e.datacenter 
SET e.output_source_ip = dt.src_ip 
WHERE e.output_source_ip IS NULL