3

如果我尝试对公用表表达式进行 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行:UNION

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
;

合并在一起的数据是相同的,但一个查询失败,另一个查询失败。

我在 Windows 7 上运行 PostgreSQL 9.3。

4

2 回答 2

4

问题是因为 CTE不是直接的文本替换并且a UNION b无效的 SELECT 语法。SELECT 关键字是解析的必需部分,甚至在考虑 CTE之前就会引发语法错误。

这就是为什么

SELECT * FROM a
UNION
SELECT * FROM b

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

于 2014-08-20T19:05:47.820 回答
1

至少在 SQL Server 中,我可以轻松地做到这一点 - 创建两个 CTE,并SELECT从每个 CTE 中执行一个,并结合一个UNION

WITH FirstNames AS 
(
    SELECT DISTINCT FirstName FROM Person
), LastNames AS 
(
    SELECT DISTINCT LastName FROM Person
)
SELECT * FROM FirstNames
UNION 
SELECT * FROM LastNames

不确定这是否也适用于 Postgres - 试一试!

于 2014-08-20T18:57:54.103 回答