【问题标题】:Change SQL statement to EXISTS clause将 SQL 语句更改为 EXISTS 子句
【发布时间】:2019-12-11 08:59:40
【问题描述】:

给定以下 SQL 语句:

select 
    OBJECT_ID
FROM HPSFWY.RVERSIONING_1703 A 
WHERE A.STAMP_ID >1 
    AND A.OBJECT_REV NOT IN (
select MAX(OBJECT_REV)
from HPSFWY.RVERSIONING_1709763 B 
where B.COMMITID <= 6066 
    and B.OBJECT_ID = A.OBJECT_ID 
    ) 

在此查询中,where 子句 AND OBJECT_REV NOT IN 必须从 NOT IN 更改为等效的 EXISTS 语句。

我们试试这个

select 
OBJECT_ID
FROM HPSFWY.RVERSIONING_1703 A 
WHERE A.STAMP_ID >1 
AND exists (
select * 
from HPSFWY.RVERSIONING_1709763 B 
where B.COMMITID <= 6066 
and B.OBJECT_ID = A.OBJECT_ID 
and B.OBJECT_REV > A.OBJECT_REV) ;

它给了我们接近的结果,但不一样

【问题讨论】:

  • 请展示您的尝试:试错是一种比简单地要求别人为您完成工作更好的学习方式。
  • 用它们所属的表别名来限定列名。
  • 相当于NOT IN 将是NOT EXISTS 重写它以使用EXISTS 将是一个完全不同的查询
  • 不是您问题的答案,但A.OBJECT_REV NOT IN (SELECT MAX(... 似乎很奇怪,因为后者返回一条记录。你可以考虑A.OBJECT_REV &lt;&gt; (SELECT MAX(...

标签: sql where-clause query-performance exists


【解决方案1】:

你可以像这样使用NOT EXISTS

SELECT A.OBJECT_ID
FROM HPSFWY.RVERSIONING_1703 A 
WHERE 
  A.STAMP_ID > 1 
  AND 
  NOT EXISTS (
    SELECT 1 FROM (
      SELECT MAX(B.OBJECT_REV) MAXOBJECT_REV
      FROM HPSFWY.RVERSIONING_1709763 B 
      WHERE B.COMMITID <= 6066 AND B.OBJECT_ID = A.OBJECT_ID 
    ) t
    WHERE t.MAXOBJECT_REV = A.OBJECT_REV
  )

注意:NOT IN 的子查询:

select MAX(OBJECT_REV)
from HPSFWY.RVERSIONING_1709763 B 
where B.COMMITID <= 6066 and B.OBJECT_ID = A.OBJECT_ID 

仅返回 1 行 1 列。
因此,您可以像这样使用&lt;&gt; 而不是NOT IN

SELECT A.OBJECT_ID
FROM HPSFWY.RVERSIONING_1703 A 
WHERE 
  A.STAMP_ID > 1 
  AND 
  A.OBJECT_REV <> (
    SELECT MAX(OBJECT_REV)
    FROM HPSFWY.RVERSIONING_1709763 B 
    WHERE B.COMMITID <= 6066 AND B.OBJECT_ID = A.OBJECT_ID 
  ) 

【讨论】:

  • 谢谢,但是我们在 DB2 上遇到错误:“A.OBJECT_ID”是一个未定义的名称.. SQLCODE=-204, SQLSTATE=42704, DRIVER=3.69.56 B.OBJECT_ID = 看起来像错误A.OBJECT_ID
  • B.OBJECT_ID = A.OBJECT_ID 是您代码的一部分。您的第一个查询有效吗?
  • 是的,第一个查询有效。您的查询适用于 Microsoft SQL,但不适用于 DB2。原始查询适用于双方服务器
  • 查询在 DB2 中的语法也很好,请检查:dbfiddle.uk/…
  • 是的,您的查询通过了 db2 检查语法,但是当我们尝试运行时它失败了: SELECT A.OBJECT_ID FROM HPSFWY.RVERSIONING_1703 A WHERE A.STAMP_ID > 1 AND NOT EXISTS ( SELECT 1 FROM ( SELECT MAX (B.OBJECT_REV) MAXOBJECT_REV FROM HPSFWY.RVERSIONING_1709763 B WHERE B.COMMITID
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 2020-06-15
  • 1970-01-01
  • 2023-04-09
  • 2013-04-17
  • 2020-01-28
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多