我通过此查询获取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
);
答案 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
的值,然后JOIN
到encoder
上的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