下面的查询试图从主数组中排除一个数组,然后对结果进行分组。
SELECT utc_offset, is_dst,
ltrim(
trim(string_agg(distinct (CASE WHEN abbrev NOT LIKE '+%' AND abbrev NOT LIKE '-%' AND abbrev != name THEN abbrev ELSE '' END), ' ')) ||
' ' || string_agg(name, ', ' ORDER BY name)
)
FROM pg_timezone_names
WHERE name NOT LIKE 'posix/%'
AND name NOT LIKE 'Etc/%'
AND (lower(abbrev) <> abbrev)
AND name NOT IN ('HST', 'Factory', 'GMT', 'GMT+0', 'GMT-0', 'GMT0', 'localtime', 'UCT', 'Universal', 'UTC', 'PST8PDT', 'ROK', 'W-SU', 'MST', 'CST6CDT')
EXCEPT
SELECT n.*, a.*
FROM pg_timezone_names n
JOIN pg_timezone_abbrevs a ON a.abbrev = n.name
WHERE n.utc_offset <> a.utc_offset
GROUP BY utc_offset, is_dst
ORDER BY utc_offset, is_dst
;
反而会产生一个错误
ERROR: column "pg_timezone_names.utc_offset" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT utc_offset, is_dst,
由于查询没有使用EXCEPT块,因此显然存在语法问题--无法看到GROUP(以及扩展后的)ORDER动词。
那么这个查询应该如何转换呢?
2条答案
按热度按时间4xrmg8kj1#
在这种情况下,您试图在对两个子查询应用EXCEPT子句后聚合它们的结果。要实现这一点,可以先应用EXCEPT,然后使用公共表表达式(CTE)执行聚合。以下是您的更新查询:
希望它能起作用:)
vs91vp4v2#
您遇到的错误是由EXCEPT子句引起的,该子句组合了两个查询的结果。使用EXCEPT时,两个查询的列名和数据类型必须匹配。在您的示例中,第一个查询选择特定的列(utc_offset、is_dst和一个连接字符串),而第二个查询使用n.* 和a.* 从pg_timezone_names和pg_timezone_focus vs表中选择所有列。列选择中的这种不匹配导致了错误。若要解决此问题,请更新查询,使EXCEPT语句的两个部分中的SELECT子句具有相同的列名和数据类型。在EXCEPT子句的两个部分中,您可以专门选择所需的列。以下是如何修改查询:
希望有帮助。