【问题标题】:Postgres SQL SELECT and UPDATE behaving differentlyPostgresql SELECT 和 UPDATE 行为不同
【发布时间】:2015-08-12 11:40:02
【问题描述】:

我不明白为什么下面的 SELECT 会找到 7065 条记录,但更新说它更新了 13935 条记录,这是表中的每条记录。

谁能说明原因?

superfrr=# select count(*)  from fromemailaddress LEFT JOIN email ON 
(email.fromemailaddress = fromemailaddress.fromemailaddress) 
WHERE LOWER(email.subject) ~ 'tester';
 count
-------
  7065

但是:

superfrr=# update fromemailaddress set call=true  from fromemailaddress 
 as fea LEFT JOIN email ON (email.fromemailaddress = fea.fromemailaddress)
 WHERE LOWER(email.subject) ~ 'tester';
UPDATE 13935

【问题讨论】:

  • 也许count 不包含空值?
  • @EMett COUNT(*) 包括所有内容,包括NULL 值以及如果一行完全包含NULL 值(example SQLFiddle
  • 请用您正在使用的数据库标记您的问题。
  • 尝试update FEA 而不是update fromemailaddress - 更新了多少行? :)
  • 如果要将条件应用于第二个表,为什么要使用 LEFT JOIN?直接使用INNER JOIN不是更直接吗?除此之外,我从未在 UPDATE 语句中使用 JOIN(但我更习惯于 Oracle,并使用 EXISTS / IN 子句处理这些情况)

标签: sql postgresql join sql-update


【解决方案1】:

~ 的使用表明您正在使用 Postgres。如果是这样,这两个查询正在做非常不同的事情。在 Postgres 中,您不会在 from 子句中包含正在更新的表。

所以,我想你想要:

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

您的版本正在更新fromemailaddress 中的所有行,因为没有条件连接update 子句中的fromemailaddressfrom 子句中的fea

另请注意:left join 是不必要的,因为 where 子句无论如何都会将其变成内连接。

【讨论】:

  • 另外值得注意的是该运算符的功能是区分大小写的正则表达式匹配。
【解决方案2】:

您必须依靠主键,它将返回所有值,因为计数不适用于空值。希望对你有帮助谢谢

select count(PrimaryKey Field)  from fromemailaddress LEFT JOIN email ON 

(email.fromemailaddress = fromemailaddress.fromemailaddress) WHERE LOWER(email.subject) ~ 'tester';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2011-02-25
    • 2014-11-29
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多