以下查询(来自此处的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'
。细节LIKE
,ILIKE
和正则表达式匹配(~
)在手动或在dba.SE此相关的答案:
并 有效地 等同于:
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中 )。
问题内容: 我需要运行以下查询: 但是在执行时会出现错误: 有什么办法吗? 问题答案: 在我看来,进行一些小的更改即可解决此问题? 更改为。因此,您对想要的价值
本文向大家介绍sql server的 update from 语句的深究,包括了sql server的 update from 语句的深究的使用技巧和注意事项,需要的朋友参考一下 一般来说update一个表, 使用where语句即可: 注意: update 语句后面的table名称,是不可以启用别名的。 那么此时的id字段,就是来自Ttest表的(无可厚非) 但是,如果update,还有额外的jo
问题内容: 似乎和我做同样的事情。 在任何情况下我都应该使用代替,反之亦然? 问题答案: 在CRUD操作中,“ 是”和“ U”。它们是持久性存储的四个基本功能中的两个。另外两个是和。如果没有至少这四个操作,则不能认为典型的数据库系统是完整的。 使用插入一个新的记录。 使用更新现有的记录。
“Maven”是什么意思-
主要内容:update 标签常用属性,传递多个参数MyBatis update 标签用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。 下面我们通过一个示例演示 update 标签的用法。 1. 在 WebsiteMapper.xml 中添加以下更新语句,代码如下。 2. 在 WebsiteMapper 接口中增加一个 updateWebsite() 方法,代码如下。 参数为
问题内容: 从文档中,我们可以了解有关该功能的以下信息: 处理所有待处理的事件,调用事件回调,完成所有待处理的几何图形管理,根据需要重新绘制窗口小部件,并调用所有待处理的空闲任务。此方法应谨慎使用,因为如果从错误的位置(例如,从事件回调内部,或者从可以以任何方式从事件回调中调用的函数等)调用,则可能导致真正令人讨厌的竞争状况。 )。如有疑问,请改用。 另一方面,关于此功能: 调用所有待处理的空闲任