当前位置: 首页 > 面试题库 >

UPDATE的FROM端与以UPDATE为目标的表有什么关系?

凌和颂
2023-03-14
问题内容

以下查询(来自此处的Postgres SQL
SELECT和UPDATE行为不同

update fromemailaddress
    set call = true 
    from email
    where email.fromemailaddress = fromemailaddress.fromemailaddress and
          LOWER(email.subject) ~ 'tester';

我的阅读方式是:

Line 1: update fromemailaddress

-我们告诉数据库我们正在更新fromemailaddress表

Line 2:        set call = true

-我们告诉数据库,名为“ call”的字段将设置为true

Line 3:        from email
Line 4:         where email.fromemailaddress = fromemailaddress.fromemailaddress and
Line 5:              LOWER(email.subject) ~ 'tester';

-好的,现在事情变得模糊了。这里实际发生了什么?看来数据库以某种方式在第3 4和5行中获取了查询结果,但是如何告诉它fromemailaddress表中要更新的行呢?什么是伪代码?是这样的吗?

for each row in (query from lines 3, 4, 5)
    set call=true?

我只是看不到SQL更新的FROM端与另一端之间的关系。

更新:

通过下面@Erwin答案中的宝贵链接,可以将我带到这些信息,这些信息成为我试图理解的核心:

http://www.postgresql.org/docs/current/interactive/sql-
update.html

当存在FROM子句时,本质上是将目标表连接到from_list中提到的表,并且连接的每个输出行都代表目标表的更新操作。使用FROM时,应确保该联接为要修改的每一行最多产生一个输出行。换句话说,目标行不应与其他表中的一行合并。如果是这样,那么将仅使用联接行之一来更新目标行,但是将很难预测将使用哪一行。

由于存在这种不确定性,因此仅在子选择内引用其他表会更安全,尽管通常比使用联接更难阅读且速度较慢。


问题答案:

UPDATE您显示的查询与以下内容完全相同:

UPDATE fromemailaddress f
SET    call = true 
FROM  (
   SELECT fromemailaddress
   FROM   email 
   WHERE  subject ILIKE '%tester%'
   ) e
WHERE  e.fromemailaddress = f.fromemailaddress;

subject ILIKE '%tester%'是的更快的等价物subject ~ 'tester'。细节LIKEILIKE和正则表达式匹配(~)在手动或在dba.SE此相关的答案:

  • 在PostgreSQL中使用LIKE,SIMILAR TO或正则表达式进行模式匹配

有效地 等同于:

UPDATE fromemailaddress f
SET    call = true
WHERE  EXISTS (
   SELECT 1
   FROM   email e
   WHERE  e.fromemailaddress = f.fromemailaddress
   AND    e.subject ILIKE '%tester%'
   );

改用它。

如果表中应该有多行,email且同一行与中的fromemailaddress某行匹配fromemailaddress,则此表格仅对每行执行
一次
更新,这与您不幸的原始表单不同。

不要被fromemailaddress这里用作列和表名的事实所迷惑。

请在此处和此处仔细阅读本手册。特别要注意的是:

from_list

表表达式的列表,允许其他表中的列出现在WHERE条件和更新表达式中。这类似于可以在语句的FROM子句 中指定的表列表SELECT。请注意,除非您打算进行自我 联接 ,否则目标表不得出现在
from_list
(在这种情况下,目标表必须以别名出现在 from_list )。



 类似资料:
  • 问题内容: 我需要运行以下查询: 但是在执行时会出现错误: 有什么办法吗? 问题答案: 在我看来,进行一些小的更改即可解决此问题? 更改为。因此,您对想要的价值

  • 问题内容: 似乎和我做同样的事情。 在任何情况下我都应该使用代替,反之亦然? 问题答案: 在CRUD操作中,“ 是”和“ U”。它们是持久性存储的四个基本功能中的两个。另外两个是和。如果没有至少这四个操作,则不能认为典型的数据库系统是完整的。 使用插入一个新的记录。 使用更新现有的记录。

  • 本文向大家介绍sql server的 update from 语句的深究,包括了sql server的 update from 语句的深究的使用技巧和注意事项,需要的朋友参考一下 一般来说update一个表, 使用where语句即可: 注意: update 语句后面的table名称,是不可以启用别名的。 那么此时的id字段,就是来自Ttest表的(无可厚非) 但是,如果update,还有额外的jo

  • “Maven”是什么意思-

  • 主要内容:update 标签常用属性,传递多个参数MyBatis update 标签用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。 下面我们通过一个示例演示 update 标签的用法。 1. 在 WebsiteMapper.xml 中添加以下更新语句,代码如下。 2. 在 WebsiteMapper 接口中增加一个 updateWebsite() 方法,代码如下。 参数为

  • 问题内容: 从文档中,我们可以了解有关该功能的以下信息: 处理所有待处理的事件,调用事件回调,完成所有待处理的几何图形管理,根据需要重新绘制窗口小部件,并调用所有待处理的空闲任务。此方法应谨慎使用,因为如果从错误的位置(例如,从事件回调内部,或者从可以以任何方式从事件回调中调用的函数等)调用,则可能导致真正令人讨厌的竞争状况。 )。如有疑问,请改用。 另一方面,关于此功能: 调用所有待处理的空闲任