sql achemy 中常见 ctes 查询的联合

问题描述 投票:0回答:1

当我尝试对这两个查询执行联合时,我有两个查询,其中包含同名的公共 ctes,它给了我 “sqlalchemy.exc.CompileError:发现多个不相关的同名 CTE”错误

我想对这两个查询的结果进行联合,如果有办法处理这个错误,请分享。这就是我尝试执行联合操作的方式

sa.union( history_stmt,
          future_stmt
        )

我想实现以下查询,但是当我尝试以编程方式对两个查询执行 sa.union 时,出现以下错误

sqlalchemy.exc.CompileError:发现多个不相关的 CTE 同名:'种子'

有什么办法可以使联合查询工作而无需保留不同的名称。

    WITH seed AS (
SELECT
    *
FROM
    SEEDD_MATERIALIZED
WHERE
    LOCATION_ID = 7
    AND PRODUCT_ID = 29
),
history AS(
SELECT
    *
FROM
    history_table
)
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN history
ON
    seed.cluster_id = history.cluster_id
UNION   
WITH seed AS (
SELECT
    *
FROM
    SEED_MATERIALIZED
WHERE
    LOCATION_ID = 7
    AND PRODUCT_ID = 29
),
future AS(
SELECT
    *
FROM
    future_table
WHERE 
    strategy_id = 4
)
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN future
ON
    seed.cluster_id = future.cluster_id
sql sqlalchemy common-table-expression
1个回答
0
投票

您能否尝试先定义 CTE,然后在联合类中引用它们:

WITH seed AS (
    SELECT
        *
    FROM
        SEED_MATERIALIZED
    WHERE
        LOCATION_ID = 7
        AND PRODUCT_ID = 29
),
history AS (
    SELECT
        *
    FROM
        history_table
),
future AS (
    SELECT
        *
    FROM
        future_table
    WHERE
        strategy_id = 4
)
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN history
ON
    seed.cluster_id = history.cluster_id
UNION
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN future
ON
    seed.cluster_id = future.cluster_id

另外,不需要未来和历史CTE:

WITH seed AS (
    SELECT
        *
    FROM
        SEED_MATERIALIZED
    WHERE
        LOCATION_ID = 7
        AND PRODUCT_ID = 29
)
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN history_table
ON
    seed.cluster_id = history_table.cluster_id
UNION
SELECT
    PROFIT
FROM
    seed
LEFT OUTER JOIN future_table
ON
    seed.cluster_id = future_table.cluster_id
    AND future_table.strategy_id = 4
© www.soinside.com 2019 - 2024. All rights reserved.