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