Amazon redshift 错误消息为[Amazon](500310)无效操作:由于内部错误,不支持此类型的相关子查询模式

Amazon redshift 错误消息为[Amazon](500310)无效操作:由于内部错误,不支持此类型的相关子查询模式,amazon-redshift,Amazon Redshift,这就是问题所在 CREATE TABLE dw_prestage.check_fact_update AS SELECT transaction_id, transaction_line_id, subsidiary_id FROM ( SELECT transaction_id, transaction_line_id, subsidiary_id FROM( SELECT

这就是问题所在

CREATE TABLE dw_prestage.check_fact_update
AS
SELECT transaction_id,
       transaction_line_id,
       subsidiary_id
FROM    ( SELECT transaction_id,
             transaction_line_id,
             subsidiary_id
        FROM( SELECT 
                document_number         ,
                transaction_number      ,
                transaction_id          ,
                transaction_line_id     ,
                transaction_order       ,
                custom_form_id          ,
                document_status         ,
                transaction_type        ,
                currency_id             ,
                trandate                ,
                exchange_rate           ,
                account_id              ,
                amount                  ,
                amount_foreign          ,
                gross_amount            ,
                net_amount              ,
                net_amount_foreign      ,
                quantity                ,
                item_id                 ,
                item_unit_price         ,
                tax_item_id             ,
                tax_amount              ,
                location_id             ,
                class_id                ,
                subsidiary_id           ,
                accounting_period_id    ,
                check_id                ,
                check_type              ,
                created_by_id           ,
                create_date             ,
                date_last_modified      ,
                trx_type                ,
                memo
                    FROM dw_prestage.check_fact a2
                        WHERE NOT EXISTS ( SELECT 1 FROM dw_prestage.check_fact_insert b2
                                            WHERE b2.transaction_id = a2.transaction_id
                                            AND b2.transaction_line_id = a2.transaction_line_id 
                                            AND   a2.subsidiary_id = b2.subsidiary_id
                                        )
             MINUS
             SELECT 
                document_number         ,
                transaction_number      ,
                transaction_id          ,
                transaction_line_id     ,
                transaction_order       ,
                custom_form_id          ,
                document_status         ,
                transaction_type        ,
                currency_id             ,
                trandate                ,
                exchange_rate           ,
                account_id              ,
                amount                  ,
                amount_foreign          ,
                gross_amount            ,
                net_amount              ,
                net_amount_foreign      ,
                quantity                ,
                item_id                 ,
                item_unit_price         ,
                tax_item_id             ,
                tax_amount              ,
                location_id             ,
                class_id                ,
                subsidiary_id           ,
                accounting_period_id    ,
                check_id                ,
                check_type              ,
                created_by_id           ,
                create_date             ,
                date_last_modified      ,
                trx_type                ,
                memo
                    FROM dw_stage.check_fact a1
                        WHERE EXISTS ( SELECT 1 FROM dw_prestage.check_fact b1
                                        WHERE b1.transaction_id = a1.transaction_id
                                        AND b1.transaction_line_id = a1.transaction_line_id 
                                        AND   a1.subsidiary_id = b1.subsidiary_id
                                    )
            )
        ) a
        WHERE NOT EXISTS (SELECT 1
                            FROM dw_prestage.check_fact_insert aa
                            WHERE aa.transaction_id = a.transaction_id
                            AND  aa.transaction_line_id = a.transaction_line_id);

请建议任何替代方法来替换此查询。

错误是因为
子句中的查询不存在
子句引用了该子句外部的表。将
notexists
子句转换为带有谓词的
LEFT JOIN
,以排除任何匹配项。这种模式通常被称为“反连接”

当前:

FROM (…) a
WHERE NOT EXISTS (SELECT 1
                   FROM dw_prestage.check_fact_insert aa
                   WHERE aa.transaction_id = a.transaction_id
                     AND  aa.transaction_line_id = a.transaction_line_id)
重写:

FROM (…) a
LEFT JOIN dw_prestage.check_fact_insert aa
       ON a.transaction_id = aa.transaction_id
      AND a.transaction_line_id = aa.transaction_line_id
WHERE aa.transaction_id IS NULL

请整理以使其可读。顺便说一句,此查询在mysql中不起作用,因为mysql不支持MINUSMySQL没有
减号
运算符。