Заменить оператор SQL на предложение EXISTS - PullRequest
0 голосов
/ 11 декабря 2019

С учетом следующего 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) ;

Это дает нам близкие результаты, но не то же самое

1 Ответ

0 голосов
/ 11 декабря 2019

Вы можете сделать это с помощью 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 столбцом. Таким образом, вместо 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 
  ) 
...