首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当UPDATE的FROM子句中没有给出连接谓词时,postgres为什么不抛出错误

在 PostgreSQL 中,UPDATE 语句的 FROM 子句允许你指定一个或多个表,这些表可以在更新操作中被引用。通常,你会在 FROM 子句后面使用 JOIN 来指定如何将这些表与正在更新的表连接起来。然而,PostgreSQL 允许你在 FROM 子句中指定表而不需要连接谓词,这种情况下,PostgreSQL 会将指定的表视为一个独立的源,而不是与正在更新的表进行连接的表。

基础概念

  • UPDATE FROM 子句:在 PostgreSQL 中,UPDATE 语句可以使用 FROM 子句来指定一个或多个表,这些表可以在 SET 子句中被引用。
  • 连接谓词:连接谓词是用来指定两个表如何连接的条件的表达式。

为什么不抛出错误

PostgreSQL 不抛出错误的原因在于,它提供了一种灵活的方式来处理更新操作。当 FROM 子句中没有给出连接谓词时,PostgreSQL 会将 FROM 子句中的表视为一个独立的源,而不是与正在更新的表进行连接的表。这意味着,FROM 子句中的表不会被用来过滤正在更新的表的行,而是作为一个独立的源来提供值。

相关优势

  • 灵活性:允许开发者在不进行表连接的情况下,从另一个表中获取值来更新当前表。
  • 简化查询:在某些情况下,可以简化查询语句,避免复杂的连接操作。

类型与应用场景

  • 独立源更新:当需要从一个独立的表中获取值来更新当前表时,可以使用这种方式。
  • 子查询替代:有时可以用 FROM 子句替代子查询,使查询更加直观。

示例代码

假设我们有两个表 employeessalaries,我们想要更新 employees 表中的 salary 字段,使用 salaries 表中的值:

代码语言:txt
复制
UPDATE employees
SET salary = salaries.salary
FROM salaries
WHERE employees.id = salaries.employee_id;

在这个例子中,FROM 子句中的 salaries 表通过 WHERE 子句与 employees 表进行了连接。如果我们省略了 WHERE 子句:

代码语言:txt
复制
UPDATE employees
SET salary = salaries.salary
FROM salaries;

PostgreSQL 不会抛出错误,但是这个查询的行为可能不是预期的,因为它会将 salaries 表中的每一行的 salary 值应用到 employees 表的每一行上。

遇到的问题及解决方法

如果你遇到了问题,比如更新操作没有按预期进行,可能是因为 FROM 子句中的表没有正确地与正在更新的表连接。解决这个问题的方法是确保 FROM 子句中的表通过连接谓词正确地与正在更新的表连接起来。

例如,如果你想要确保只有当 employees 表中的 idsalaries 表中的 employee_id 匹配时才进行更新,你应该使用 WHERE 子句来指定这个条件:

代码语言:txt
复制
UPDATE employees
SET salary = salaries.salary
FROM salaries
WHERE employees.id = salaries.employee_id;

这样,只有当两个表中的相应行匹配时,更新操作才会执行。

总之,PostgreSQL 的这种设计提供了灵活性,但同时也要求开发者注意确保 FROM 子句中的表正确地与正在更新的表连接,以避免意外的更新结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 GROUP BY 之后不能直接引用原表中的列

,会报 Unknown column ‘’ in field list 这样的语法错误     PIPES_AS_CONCAT       将 || 视为字符串的连接操作符而非 ��� 运算符,这和Oracle...启用 NO_ENGINE_SUBSTITUTION 时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning     STRICT_TRANS_TABLES...0,产生一个warning;       2、Out Of Range,变成插入最大边界值;       3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值...那为什么会有 ONLY_FULL_GROUP_BY 模式呢 ? 我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

1.7K10

神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

,会报 Unknown column ‘’ in field list 这样的语法错误     PIPES_AS_CONCAT       将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle...启用 NO_ENGINE_SUBSTITUTION 时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning     STRICT_TRANS_TABLES...0,产生一个warning;       2、Out Of Range,变成插入最大边界值;       3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值...GROUP BY 子句中的列。...那为什么会有 ONLY_FULL_GROUP_BY 模式呢 ? 我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。

2.2K20
  • GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause

    ,会报 Unknown column ‘’ in field list 这样的语法错误 PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 或 运算符,这和Oracle数据库是一样的,...启用 NO_ENGINE_SUBSTITUTION 时,那么直接抛出错误;不设置此值时,CREATE用默认的存储引擎替代,ATLER不进行更改,并抛出一个 warning STRICT_TRANS_TABLES...0,产生一个warning; 2、Out Of Range,变成插入最大边界值; 3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值; 解决步骤 MySQL...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的...SELECT 子句中不能直接引用原表中的列的原因;   3、一般来说,单元素集合的属性和其唯一元素的属性是一样的。

    3.2K50

    SQL命令 WHERE(一)

    子查询必须用圆括号括起来。 WHERE子句可以使用=(内部连接)符号连接操作符指定两个表之间的显式连接。 WHERE子句可以使用箭头语法(- >)操作符在基表和来自另一个表的字段之间指定隐式连接。...不能通过列别名指定字段; 尝试这样做会产生SQLCODE -29错误。 但是,可以使用子查询来定义列别名,然后在WHERE子句中使用该别名。...在条件表达式中指定日期或时间时,可能由于SQL模式与日期或时间格式不匹配,或由于无效的日期或时间值而发生错误。 WHERE子句条件表达式必须使用与当前模式相对应的日期或时间格式。...(FavoriteColors)='Red' 当%EXTERNAL将列表转换为DISPLAY格式时,显示的列表项似乎由一个空格分隔。...当NULL是离群值时,is NULL和is NOT NULL谓词不需要特殊编码。 离群值选择性由运行调优表实用程序决定。

    3K20

    SqlServer的执行计划如何分析?

    Why(为什么):执行计划可以帮助你理解查询的性能问题,例如为什么查询运行缓慢或返回错误结果。...子查询: Scalar Subquery(标量子查询):对应 SQL 语句中的标量子查询,用于获取单个值的子查询。...Update(更新):对应 SQL 语句中的 UPDATE 子句,用于更新表中的数据。 Delete(删除):对应 SQL 语句中的 DELETE FROM 子句,用于删除表中的数据。...Aggregate JOIN Nested Loops/Hash Match/Merge Join INSERT INTO Insert UPDATE Update DELETE FROM Delete...join查询 当使用 JOIN 查询时,数据库会根据连接条件将两个或多个表中的数据进行关联。这样可以从多个表中获取相关的数据,以满足复杂的查询需求。

    75440

    数据库学习笔记(一)

    自居的区别: 作用对象不同 where 子句作用于基表或视图,从中选择满足条件的元组 having 短语作用于组,从中选择满足条件的元组 where 子句中不能使用聚集函数作为条件表达式 3.2 连接查询...带有any(some)或all谓词的子查询 */ # 使用any或all谓词时需要同时使用比较运算 # any表示子查询结果中的某个值, all表示子查询结果中的所有值 select Sname, Sage...带有exists谓词的子查询 */ select Sname from Student where exists # 带有exists谓词的子查询不返回任何数据,若内层查询结果为空,则外层的where...values('2012322221', 'ttt', '男', 111, 'CS'); # into子句没有给出指定属性列,所以插入的是完整的元组 插入子查询结果 /* 1....和delete操作时要保证更新、插入和删除的行满足视图定义中的谓词条件 create view IS_Student as select Sno from Student where Sdept =

    1.3K40

    SQL命令 SELECT(一)

    解析为正整数的输入参数。 如果没有指定TOP关键字,则默认显示满足SELECT条件的所有行。 TOP ALL仅在子查询或CREATE VIEW语句中有意义。...当SELECT仅用于返回此类非数据库值时,FROM子句是可选的。 从SELECT查询返回的值称为结果集。 在动态SQL中,SELECT将值检索到%SQL中。 声明类。...作为子查询,为外围SELECT语句的子句提供值的SELECT语句。 SELECT语句中的子查询可以在选择项列表、FROM子句或带EXISTS或in谓词的WHERE子句中指定。...子查询也可以在UPDATE或DELETE语句中指定。 子查询必须用括号括起来。 UNION语句允许将两个或多个SELECT语句组合成一个查询。...当使用SELECT *时,请注意列级权限覆盖GRANT语句中命名的所有表列; 表级权限涵盖所有表列,包括分配权限后添加的列。 没有必要的特权将导致SQLCODE -99错误(特权违反)。

    5.3K10

    db2 terminate作用_db2 truncate table immediate

    08502 用 TWOPHASE 的 SYNCPOINT 运行的应用程序进程发出的 CONNECT 语句无效,因为无事务管理器可用。08504 当处理指定的路径重命名配置文件时遇到错误。...类代码 21:基数违例 SQLSTATE 值 含义21000 SELECT INTO 的结果是一个多行的结果表,或者,基本谓词的子查询结果为多个值。...42805 ORDER BY 子句中的整数不标识结果表中的列。42806 不能将某值赋予某主机变量, 因为数据类型不兼容。42807 对该对象不允许执行 INSERT、UPDATE 或 DELETE。...428C2 检查函数体指出应已在 CREATE FUNCTION 语句中指定给出的子句。 428C4 谓词运算符两边的元素的数目不相同。 428C5 从数据源中找不到数据类型的数据类型映射。...428E6 用户定义的谓词中的方法的搜索参数与索引扩展名的相应搜索方法的搜索参数不匹配。 428E7 用户定义的谓词中跟在比较运算符后的操作数类型与 RETURNS 数据类型不匹配。

    7.7K20

    【数据库SQL server】关系数据库标准语言SQL之数据查询

    当能确切知道内层查询返回单值时,可用比较运算符(>,=,谓词时必须同时使用比较运算 语义为: > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 子查询结果中的某个值...EXISTS谓词,存在量词 ヨ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。...谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点)...'CS' AND Sage>19; 5 基于派生表的查询 子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象 【1】找出每个学生超过他自己选修课程平均成绩的课程号

    25110

    PostgreSQL 13.0-13.15 功能更新和bug fixed列表

    () 可能返回包含垃圾值的额外行,确保pg_stop_backup()正确清理会话状态 PG13.8 修复在FOR [KEY] UPDATE/SHARE子句中的连接别名匹配 PG13.8 拒绝在FROM...PG13.9 修复创建分区索引时索引表达式和谓词不匹配的问题,在创建分区索引时,我们尝试识别与分区索引匹配的现有索引,以便将其作为子索引吸收而不是构建新的索引。...PG13.14 修复在 PlaceHolderVars 中错误包装子查询输出表达式的问题,此修复解决了在子查询位于外连接下方且其输出列横向引用了外连接范围外的内容时产生错误结果的问题。...如果实际函数输出值不匹配,应在运行时抛出错误。然而,一些代码路径会过早检查实际值,并可能在不匹配预期时发出奇怪的错误或遭遇断言失败。...PG13.15 在重新索引时访问索引抛出错误,以前这只是一个断言检查,但现在已升级为常规运行时错误。当重新索引一个试图访问其自身表的用户定义索引表达式时,这将提供更准确的错误消息。

    14010

    GreenPlum中的数据库对象

    当表共享一个共同的分布键时,在它们共享的分布键列上的连接或者排序工作会在本地完成。对于随机分布策略来说,本地连接操作就行不通了。...当一个叶子子分区是外部表时,对分区表有一些限制: 针对包含外部表分区的分区表运行的查询将用传统查询优化器执行。 外部表分区是一个只读外部表。尝试在该外部表分区中访问或者修改数据的命令会返回一个错误。...验证分区策略 当一个表基于查询谓词被分区时,用户可以使用 EXPLAIN来验证查询优化器只扫描相关的数据来检查查询计划。...在被用于频繁连接的一个列(例如一个外键列)上的索引能够提升连接性能,因为这让查询优化器有更多的连接方法可以使用。 索引在谓词中频繁使用的列。 频繁地在WHERE子句中被引用的列是索引的首选。...8.创建和管理视图 视图允许用户保存常用的或者复杂的查询,然后在一个 SELECT语句中把它们当作表来访问。视图在磁盘上并没有被物理存储:当用户访问视图时查询会作为一个子查询运行。

    84420

    【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询

    带有比较运算符的子查询 当能确切知道内层查询返回单值时,可用比较运算符(>,=,)。 【1】在查询与“刘晨”在同一个系学习的学生。...使用ANY或ALL谓词时必须同时使用比较运算 语义为: > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 子查询结果中的某个值...EXISTS谓词,存在量词 ヨ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。...谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点)...'CS' AND Sage>19; 1.5基于派生表的查询 子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象 【1】找出每个学生超过他自己选修课程平均成绩的课程号

    71610

    优化查询性能(四)

    当自动并行处理被激活时,在分片环境中执行的查询将始终使用并行处理执行,而不管并行阈值是多少。 针对特定查询的并行查询处理 可选的%PARALLEL关键字在查询的FROM子句中指定。...插入命令子查询不能使用%PARALLEL。 当应用于与外围查询相关的子查询时,%PARALLEL将被忽略。...where Name = p.Name) 当应用于包含复杂谓词的子查询,或优化为复杂谓词的谓词时,%PARALLEL将被忽略。...查询成功执行,没有发出错误,但没有执行并行化: 该查询包含FOR某些谓词。 该查询包含一个TOP子句和一个ORDER BY子句。 这种子句组合优化了不使用并行处理的最快时间到第一行。...如果查询不包含聚合函数,%PARALLEL和%NOTOPOPT的组合将执行查询的并行处理。 包含左外连接或内连接(其中ON子句不是相等条件)的查询。

    2.7K30

    SQL命令 HAVING(一)

    不能按列别名指定字段或聚合函数;尝试这样做会生成SQLCODE-29错误。但是,可以使用子查询定义列别名,然后在HAVING子句中使用该别名。...如果小于100行,所有行的Age值的平均值可能被认为没有意义,因此不应该返回: SELECT AVG(Age) FROM Sample.Person HAVING COUNT(*)>99 多行:带有聚合函数且没有...Age > 40 AND Age < 65 ORDER BY Age 只有满足以下两个条件时,%AFTERHAVING关键字才会给出有意义的结果: 选择项列表必须至少包含一个非聚合字段引用的项。...这个字段引用可以是FROM子句中指定的任何表中的任何字段、使用隐式连接(箭头语法)引用的字段、%ID别名或星号(*)。 HAVING子句条件必须应用至少一个非聚合条件。...因此,两个字符串字段值的比较或字符串字段值与字符串文字的比较(默认情况下)不区分大小写。

    1.5K40

    史上最全的 DB2 错误代码大全

    42802 待插入的数值的个数于被插入的行中的列数不相等 -118 42902 数据修改语句(UPDATE或DELETE)和FROM语句中的表和视图命名不合法 -119 42803 HAVING语句中的列的列表与...-126 42829 不能为一个UPDATE语句指定ORDER BY语句 -127 42905 在子选择中DISTINCT只能指定一次 -128 42601 SQL谓词中NULL使用不当 -129 54004...-410 42820 浮点文字笔30个字符的最大允许长度长 -411 56040 CURRENT SQLID使用无效 -412 42823 在子查询的选择列表中遇到了多个列 -413 22003 当转换为一个数字型数据类型时...INSERT、UPDATE或DELETE语句不能被发布,应为这些语句对DB2 CATLOG表执行写操作 -611 53088 当LOCKSIZE是TABLE或者TABLESPACE时,LOCKMAX必须为...811 21000 当多行作为一内嵌的选择语句的返回结果是,必须使用游标 -812 22508 在CURRENT PACKAGESET中的ID集合是空白的,语句不能被执行 -815 42920 在一个内置选择语句或者一个基本谓词的子查询中

    4.8K30

    数据库sql嵌套查询题_sql子查询嵌套优化

    二、嵌套查询方式 2.1 带有比较运算符的子查询 带有比较运算符的子查询是指父查询和子查询之间用比较运算符连接,当用户能确切知道子查询返回的是单个值时,可以用带有比较运算符的子查询; 比较运算符:...带有in谓词的子查询 用在where子句中用来判断查询的属性是否在多个值的列表中。...2.3 带有any(some)或all谓词的子查询 有的系统用any,有的用some; 子查询返回单值时可以用比较运算符,但返回多值时使用any/some谓词修饰符。...带有exists谓词的子查询不返回任何数据,只产生逻辑真值”true“或逻辑假值”false“。它只查找满足条件的那些记录。一旦找到第一个匹配的记录后,就马上停止查找。...由exists引出的子查询,其目标列表达式通常都是用 * ,因为带exists的子查询只返回真值或假值,给出列名没有实际意义。

    2.7K10

    Hive3查询基础知识

    a) Hive在会话结束时删除临时表。 使用子查询 Hive支持可用于许多Hive操作的FROM子句和WHERE子句中的子查询,例如,根据另一个表的内容过滤来自一个表的数据。...子查询是内部查询中的SQL表达式,它将结果集返回到外部查询。从结果集中,评估外部查询。外部查询是包含内部子查询的主要查询。WHERE子句中的子查询包含查询谓词和谓词运算符。谓词是计算为布尔值的条件。...• 子查询谓词必须显示为顶级连接词。 • 子查询在查询谓词中支持四个逻辑运算符:IN,NOT IN,EXISTS和NOT EXISTS。...• EXISTS和NOT EXISTS运算符必须至少具有一个相关谓词。 • 子查询的左侧必须限定对表列的所有引用。 • 仅在子查询的WHERE子句中允许引用父查询中的列。...TABLE s1 SELECT *; 转义非法标识符 当您需要在列或分区名称中使用保留字、特殊字符或空格时,请将其括在反引号(`)中。

    4.7K20

    SQL谓词的概述(一)

    谓词可以如下使用: 在SELECT语句的WHERE子句或HAVING子句中确定哪些行与特定查询相关。 注意,不是所有谓词都可以在HAVING子句中使用。...在JOIN操作的ON子句中确定哪些行与连接操作相关。 在UPDATE或DELETE语句的WHERE子句中,确定要修改哪些行。 WHERE CURRENT OF语句的AND子句中。...LIKE - 使用文字和通配符的模式匹配条件。当希望返回包含已知子字符串的文字字符或包含已知序列中的多个已知子字符串的数据值时,请使用LIKE。LIKE使用其目标的排序规则进行字母大小写比较。...%Find支持涉及位图索引的比较。 NULL NULL表示没有任何值。根据定义,它不能通过所有布尔测试:没有值等于NULL,没有值不等于NULL,没有值大于或小于NULL。...即使NULL=NULL也不能作为谓词。因为IN谓词是一系列相等性测试,所以在IN值列表中指定NULL没有意义。因此,指定任何谓词条件都会消除该字段的任何为空的实例。

    1.2K20

    【数据库】MySQL进阶八、多表查询

    语句有错误。...:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询....) 内连接:把查询结果作为WHERE子句的查询条件即称为内连接 五 复杂的嵌套查询 多表之间的嵌套查询可以通过谓词IN实现,语法格式如下: test_expression[NOT] IN{ subquery...六 嵌套查询在查询统计中的应用 实现多表查询时,可以同时使用谓词ANY、SOME、ALL,这些谓词被称为定量比较谓词,可以和比较运算符联合使用,判断是否全部返回值都满足搜索条件.SOME和ANY谓词是存在量的...tb_demo071) AS people 注:子查询应遵循以下规则: (1)由比较运算符引入的内层子查询只包含一个表达式或列名,在外层语句中的WHERE子句内命名的列必须与内层子查询命名的列兼容 (

    2.4K40

    DB2错误代码_db2错误码57016

    42802 待插入的数值的个数于被插入的行中的列数不相等 -118 42902 数据修改语句(UPDATE或DELETE)和FROM语句中的表和视图命名不合法 -119 42803 HAVING语句中的列的列表与...-126 42829 不能为一个UPDATE语句指定ORDER BY语句 -127 42905 在子选择中DISTINCT只能指定一次 -128 42601 SQL谓词中NULL使用不当 -129 54004...-410 42820 浮点文字笔30个字符的最大允许长度长 -411 56040 CURRENT SQLID使用无效 -412 42823 在子查询的选择列表中遇到了多个列 -413 22003 当转换为一个数字型数据类型时...INSERT、UPDATE或DELETE语句不能被发布,应为这些语句对DB2 CATLOG表执行写操作 -611 53088 当LOCKSIZE是TABLE或者TABLESPACE时,LOCKMAX必须为...811 21000 当多行作为一内嵌的选择语句的返回结果是,必须使用游标 -812 22508 在CURRENT PACKAGESET中的ID集合是空白的,语句不能被执行 -815 42920 在一个内置选择语句或者一个基本谓词的子查询中

    2.6K10
    领券