我希望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
答案 0 :(得分:0)
我用
min(short_names.short_name)
而不是
(array_agg(short_names.short_name))[1]
但除此之外,我无法想到更好的方法来实现这一目标。