Sql 使用左外部联接的POSTGRES更新无效
请告诉我,我做错了什么Sql 使用左外部联接的POSTGRES更新无效,sql,postgresql,sql-update,left-join,Sql,Postgresql,Sql Update,Left Join,请告诉我,我做错了什么 UPDATE uc SET uc.selected_value_id = cv.id, uc.fixed_value = NULL FROM unit_characteristic uc left JOIN characteristic_value cv ON uc.fixed_value like CONCAT(cv.value,'%') WHERE cv.characteristic_id = 6 and uc.characteristic_id = 6 an
UPDATE uc
SET uc.selected_value_id = cv.id, uc.fixed_value = NULL
FROM unit_characteristic uc
left JOIN characteristic_value cv ON uc.fixed_value like CONCAT(cv.value,'%')
WHERE cv.characteristic_id = 6
and uc.characteristic_id = 6
and uc.unit_id in (6313,6314)
获取错误
SQL错误[42P01]:错误:关系“uc”不存在
职位:8
org.postgresql.util.PSQLException:错误:关系“uc”不存在
职位:8
虽然这个选择工作正常
select count(uc.*)
FROM unit_characteristic uc
left JOIN characteristic_value cv ON uc.fixed_value like CONCAT(cv.value,'%')
WHERE cv.characteristic_id = 6
and uc.characteristic_id = 6
and uc.unit_id in (6313,6314)
在Postgres中,
更新
中的引用不能引用来自的中的表。我怀疑你想要:
update unit_characteristic uc
set selected_value_id = cv.id,
fixed_value = NULL
from characteristic_value cv
where uc.fixed_value like cv.value || '%' and
cv.characteristic_id = 6 and
uc.characteristic_id = 6 and
uc.unit_id in (6313, 6314);
请注意,您的查询版本使用左连接
。但是where
子句将其转换为内部连接anway。
- 您不必在
FROM
子句中重复目标表;它已在范围表中
- 目标表可以有别名
- 但是,
SET columnname=new_值
line不能使用此别名。它是隐式的(因为只有一个表引用需要更新)
仍在获取错误SQL错误[42703]:错误:关系“单位特征”的列“uc”不存在位置:40 org.postgresql.util.PSQLException:错误:关系“单位特征”的列“uc”不存在位置:40@TanuGarg . . . 所有比较和列引用都来自您的查询。您尚未指定表或提供示例数据。因此,修复条件,使其与您的数据匹配。得到解决方案。导致问题的是具有列名的别名。更新public.unit|characteristic uc set selected_value_id=cv.id,fixed_value=NULL,从public.characteristic_value cv中选择,其中uc.fixed_值如cv.value | |“%”和cv.characteristic_id=6和uc.characteristic_id=6@TanuGarg . . . 集合的左侧不需要它们
更新。。。从左开始连接
无论如何都没有意义。幸运的是,WHERE cv.characteristic_id=6
将左连接转换为正常的内部连接。如果使用左连接或WHERE,两者都会出现相同的错误。注释与语义有关,而与语法无关。(请参阅wildplasser的注释,它们与代码有关,但与错误消息无关:)LEFT JOIN ON返回行上的内部联接并将所有不匹配的左表行以NULL扩展。始终知道要将什么内部联接作为外部联接的一部分。在左连接打开后,要求右[sic]表列不为NULL的WHERE、INTERNAR JOIN或HAVING将删除引入NULL的任何行,即只保留行上的内部连接,即“将外部连接转换为内部连接”。你知道了,找到解决办法了。导致问题的是列名的别名。update public.unit|characteristic uc set从public.characteristic|value cv中选择了_value|id=cv.id,fixed_value=NULL,其中uc.fixed|u value像cv.value | |‘%'和cv.characteristic|id=6和uc.characteristic|id=6这是我写的。
UPDATE unit_characteristic uc
SET selected_value_id = cv.id
, fixed_value = NULL
FROM characteristic_value cv
WHERE uc.fixed_value like cv.value || '%'
AND cv.characteristic_id = 6
AND uc.characteristic_id = 6
AND uc.unit_id in (6313, 6314)
;