SQL WHERE EXISTS 掩盖了子查询中的错误

Posted

技术标签:

【中文标题】SQL WHERE EXISTS 掩盖了子查询中的错误【英文标题】:SQL WHERE EXISTS is masking errors in Subquery 【发布时间】:2019-01-09 11:15:28 【问题描述】:

我正在运行查询来更新表中的标志,该标志依赖于检查子查询中是否存在值,但是当子查询出错(除以零)时,EXISTS 语句将其视为返回行并继续更新。

例如

Update xxxx
Set Flagfield=1 
FROM xxxx
WHERE
EXISTS (
Select * FROM yyyy Inner join xxxx on xxx.ID = yyyy.id
WHERE yyyy.int1 / yyyy.int2 > 1)

有其他人经历过这种行为吗?可以预料到吗?

【问题讨论】:

好像yyyy.int2 等于零 为什么要做除法,这WHERE yyyy.int1 > yyyy.int2不够吗? 你真的在 SQL 更新中有两次 xxxx 表? 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称(并且您的 UPDATE 是非标准 SQL)。请为您使用的数据库产品添加tag postgresql, oracle, sql-server, db2, ... 您不需要将外部查询与存在查询关联起来吗?如果只有其中一行满足您的存在,您将更新所有 xxxx? 【参考方案1】:

如果我正确理解了您的问题,那么您可以尝试以下代码,只需在 where 语句中添加对 int2 的检查即可。

Update xxxx
Set Flagfield=1 
FROM xxxx
WHERE
EXISTS (
Select * FROM yyyy Inner join xxxx on xxx.ID = yyyy.id
WHERE (yyyy.int2 IS NOT NULL AND yyyy.int2 <> 0) AND (yyyy.int1 / yyyy.int2 > 1))

【讨论】:

以上是关于SQL WHERE EXISTS 掩盖了子查询中的错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的exists 和not exists 用法详解

关于sql中where exists的问题

使用 WHERE NOT EXISTS 的 SQL 查询出错

如何在 SQL 子查询中使用 WHERE EXISTS?

sql 查询的正确语法和 WHERE EXISTS 替代方案

SQL 中 EXISTS 与 NOT EXISTS