从SELECT JOIN更新唯一匹配

时间:2017-07-16 22:00:22

标签: sql postgresql postgresql-9.5

我希望UPDATE FROM SELECT JOIN,但前提是在连接的右侧只有一个匹配项。这有成语吗?

我有short_name(例如ABC)和long_name(例如ABC-DEF-01)。对于每个长名称,查看是否有与之匹配的短名称(例如ABC-DEF-001中的ABC)。如果恰好有一个匹配的短名称,请使用该short_name值更新空的short_name列。

我相信这可以完成任务,但我不认为这是正确的方式。是否有更清洁更快方式? Here's an interactive version为方便起见。

我特别关注array_agg(),这似乎与关系习语不符。

create table long_names (short_name varchar, long_name varchar);
insert into long_names (long_name)
values
('ABC-DEF-01'),
('ABC-DEF-02'),
('CDE-FGH-01');


create table short_names(short_name varchar);
insert into short_names(short_name)
values
('ABC'),
('DEF'),
('FGH');


UPDATE long_names
SET short_name = subquery.short_name 
FROM (
SELECT
    long_names.long_name, 
    count(short_names.short_name), 
    (array_agg(short_names.short_name))[1] AS short_name
FROM long_names 
LEFT JOIN short_names
ON long_names.long_name LIKE ('%' || short_names.short_name || '%')
GROUP BY long_names.long_name
HAVING count(DISTINCT short_names.short_name) = 1
) AS subquery
WHERE long_names.long_name = subquery.long_name

1 个答案:

答案 0 :(得分:0)

我用

min(short_names.short_name)

而不是

(array_agg(short_names.short_name))[1]

但除此之外,我无法想到更好的方法来实现这一目标。