gpt4 book ai didi

postgresql - 当a和b是CTE时如何执行 "a UNION b"?

转载 作者:行者123 更新时间:2023-11-29 12:45:26 24 4
gpt4 key购买 nike

如果我尝试 UNION(或 INTERSECT 或 EXCEPT)一个公用表表达式,我会在 UNION 附近遇到语法错误。如果我不使用 CTE 而直接将查询放入联合中,一切都会按预期进行。

我可以解决这个问题,但对于一些更复杂的查询,使用 CTE 会使事情更具可读性。我也不喜欢不知道为什么会失败。

例如,以下查询有效:

SELECT *
FROM
(
SELECT oid, route_group
FROM runs, gpspoints
WHERE gpspoints.oid = runs.start_point_oid

UNION

SELECT oid, route_group
FROM runs, gpspoints
WHERE gpspoints.oid = runs.end_point_oid
) AS allpoints
;

但是这个失败了:错误:“UNION”处或附近的语法错误第 20 行:联合

WITH 
startpoints AS
(
SELECT oid, route_group
FROM runs, gpspoints
WHERE gpspoints.oid = runs.start_point_oid
),
endpoints AS
(
SELECT oid, route_group
FROM runs, gpspoints
WHERE gpspoints.oid = runs.end_point_oid
)
SELECT *
FROM
(
startpoints
UNION
endpoints
) AS allpoints
;

被 UNION 在一起的数据是相同的,但是一个查询失败而另一个没有。

我在 Windows 7 上运行 PostgreSQL 9.3。

最佳答案

问题是因为 CTE 不是直接文本替换,a UNION b 无效 SELECT syntax . SELECT 关键字是解析的强制性部分,语法错误甚至不考虑 CTE 之前就出现了。

这就是为什么

SELECT * FROM a
UNION
SELECT * FROM b

作品;语法有效,然后在表位置使用 CTE(由 ab 表示)(通过 with_query_name)。

关于postgresql - 当a和b是CTE时如何执行 "a UNION b"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25412218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com