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 用法详解
使用 WHERE NOT EXISTS 的 SQL 查询出错