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)
   ;