语法错误:带删除的横向联接(PostgreSQL)

语法错误:带删除的横向联接(PostgreSQL),postgresql,lateral,Postgresql,Lateral,PostgreSQL 11.1 好的,这是正确的,应该运行。删除时出现语法错误,失败。我错过了什么 谢谢你的帮助 错误:删除处或附近出现语法错误 第41行:从d中删除 您不能使用删除。。。返回查询的“发件人”列表。即使删除它也会导致相同的语法错误。:???删除delete肯定不会导致有关delete的语法错误。我想我没有领会您的观点:。我仍然有一个语法错误,没有返回。建议??没有,因为您的查询太复杂,无法理解。但是你当然可以重写它,这样相关子查询中就不会有删除了。把所有CTE放在一起,而不使用横

PostgreSQL 11.1

好的,这是正确的,应该运行。删除时出现语法错误,失败。我错过了什么

谢谢你的帮助

错误:删除处或附近出现语法错误 第41行:从d中删除


您不能使用删除。。。返回查询的“发件人”列表。

即使删除它也会导致相同的语法错误。:???删除delete肯定不会导致有关delete的语法错误。我想我没有领会您的观点:。我仍然有一个语法错误,没有返回。建议??没有,因为您的查询太复杂,无法理解。但是你当然可以重写它,这样相关子查询中就不会有删除了。把所有CTE放在一起,而不使用横向查询,就可以很容易地重写它。这样做确实需要返回语法,但运行和编译都很顺利。这就带来了问题:
WITH _in (tservice, patient_recid, disease_recid, new_disease_recid) AS (
        VALUES ('2021-04-21'::timestamp, '23262'::integer, '34978'::integer, '33364'::integer)    
)
UPDATE dx d
SET disease_recid = n.new_disease_recid
FROM _in n,
    LATERAL ( WITH RECURSIVE readtoend AS(
                SELECT recid, newrecid
                    FROM patients p1
                    JOIN _in n ON p1.recid = n.patient_recid
                UNION
                SELECT  c.recid, c.newrecid
                    FROM patients c
                    INNER JOIN readtoend s ON s.newrecid = c.recid
            ),
            readtostart AS(
                SELECT recid, newrecid
                        FROM patients p1
                        JOIN _in n ON p1.recid = n.patient_recid
                    UNION
                    SELECT c.recid, c.newrecid
                        FROM patients c
                        INNER JOIN readtostart s ON s.recid = c.newrecid
            )
                SELECT recid FROM readtoend
                UNION
                SELECT recid FROM readtostart            
            ) j,
    LATERAL ( WITH _get_existing_target AS(                               
                    SELECT d.*
                    FROM d
                    WHERE (d.patient_recid, d.disease_recid) = (j.recid, n.new_disease_recid) AND d.tservice <= n.tservice
                ),
                 _get_conflicts AS(                                    
                    SELECT d.*
                    FROM d  
                    WHERE (d.patient_recid, d.disease_recid) = (j.recid, n.disease_recid) AND EXISTS (  SELECT 1
                                    FROM _get_existing_target x
                                    WHERE d.patient_recid = x.patient_recid AND d.tservice::date = x.tservice::date)
                )
                DELETE FROM d
                USING _get_conflicts f
                WHERE d.recid = f.recid
                RETURNING d.*
                ) del
WHERE (d.patient_recid, d.disease_recid)  = (j.recid, n.disease_recid) AND d.tservice::date <= n.tservice::date
       AND  d.recid NOT IN ( SELECT recid FROM del);