Postgres SQL选择和更新行为不同
我不明白为什么下面的选择会找到7065条记录,但更新说它会更新13935条记录,这是表中的每条记录 有人能提出原因吗Postgres SQL选择和更新行为不同,sql,postgresql,join,sql-update,Sql,Postgresql,Join,Sql Update,我不明白为什么下面的选择会找到7065条记录,但更新说它会更新13935条记录,这是表中的每条记录 有人能提出原因吗 superfrr=# select count(*) from fromemailaddress LEFT JOIN email ON (email.fromemailaddress = fromemailaddress.fromemailaddress) WHERE LOWER(email.subject) ~ 'tester'; count ------- 706
superfrr=# select count(*) from fromemailaddress LEFT JOIN email ON
(email.fromemailaddress = fromemailaddress.fromemailaddress)
WHERE LOWER(email.subject) ~ 'tester';
count
-------
7065
但是:
使用
~
表示您正在使用Postgres。如果是这样,这两个查询所做的事情就大不相同了。在Postgres中,不在from
子句中包含正在更新的表
所以,我想你想要:
update fromemailaddress
set call = true
from email
where email.fromemailaddress = fromemailaddress.fromemailaddress and
LOWER(email.subject) ~ 'tester';
您的版本正在更新fromemailaddress
中的所有行,因为在update
子句和from
子句中没有连接fromemailaddress
的条件
另请注意:
左连接
是不必要的,因为where
子句将其转换为内部连接。使用~
表示您正在使用Postgres。如果是这样,这两个查询所做的事情就大不相同了。在Postgres中,不在from
子句中包含正在更新的表
所以,我想你想要:
update fromemailaddress
set call = true
from email
where email.fromemailaddress = fromemailaddress.fromemailaddress and
LOWER(email.subject) ~ 'tester';
您的版本正在更新fromemailaddress
中的所有行,因为在update
子句和from
子句中没有连接fromemailaddress
的条件
另请注意:
左连接
是不必要的,因为where
子句无论如何都会将其转换为一个内部连接。您必须对主键进行计数,它将返回所有值,因为count对空值不起作用。希望这有帮助,谢谢
select count(PrimaryKey Field) from fromemailaddress LEFT JOIN email ON
(email.fromemailaddress=fromemailaddress.fromemailaddress)
其中较低的(email.subject)~'tester' 您必须在主键上计数,它将返回所有值,因为计数不适用于空值。希望这有帮助,谢谢
select count(PrimaryKey Field) from fromemailaddress LEFT JOIN email ON
(email.fromemailaddress=fromemailaddress.fromemailaddress)
其中较低的(email.subject)~'tester' 也许
count
不包括空值?@EMettcount(*)
包括所有内容,null
值包括在内,如果一行完全包含null
值()请使用您正在使用的数据库标记您的问题。请尝试使用更新FEA
而不是从EmailAddress更新
-更新了多少行?:)如果要对第二个表应用条件,为什么要使用左联接?直接使用内部联接不是更简单吗?除此之外,我从未在更新语句中使用连接(但我更习惯于Oracle,并使用EXISTS/in子句处理这些情况)也许count
不包含空值?@EMettcount(*)
包含所有内容,null
包含值,并且如果一行包含null
全部值()请使用您正在使用的数据库标记您的问题。请尝试使用更新FEA
而不是从EmailAddress更新
-更新了多少行?:)如果要对第二个表应用条件,为什么要使用左联接?直接使用内部联接不是更简单吗?除此之外,我从未在更新语句中使用连接(但我更习惯于Oracle,并使用EXISTS/in子句处理这些情况),还值得注意的是,该运算符的功能是区分大小写的正则表达式匹配。还值得注意的是,该运算符的功能是区分大小写的正则表达式匹配。