Как правильно использовать EXISTS и IN в SQL - PullRequest
1 голос
/ 07 ноября 2019

Я сравниваю два запроса, используя EXISTS и IN. Они оба дают разные результаты. Когда я использую запрос с использованием IN, результат является правильным, но при использовании запроса EXISTS я получаю несколько записей, должна была быть только 1 запись.

Тест производительности: IN Query - 17 секунд, чтобы получить результат EXISTS Query - 9-11 секунд, чтобы получить результат

Ожидаемый результат: 1 - запись

IN-запрос (1 запись):

SELECT CINO, CLIENTID, COID, ADDRVER, ASSETFIX, AVEMONSALE, BRCHAFFL, BUS
  DESC, BUSTYPE, CAPITAL, CONTACT, FACCOND, FIXASSET, FIXTURE, INFADDR,
  INFORMANT, INVENTORY, LANDLORD, LASTYRSALE, LIABILITY, LINEPRDSRV,
  LOTAREA, MACHINE, MAJBAN, MAKE, MOTOR, NATINC, NUMEMPLOY, OBSERVE,
  OBSERVE2, OBTINFORM, OFFCAREA, OFFCBLDG, OFFCLOC, OFFCVALUE, OFFORG,
  OTHERINC, POSITION, RECEIVABLE, REGWITH, REMARKS, REMNEG, REMPOS, RENTEXP,
  YRSOPER, YRINCOME, DATEORG, SUPPLIER 
FROM LCBINV 
WHERE CINO IN (
  SELECT CINO FROM LCMINV WHERE AUDITKY IN (
    SELECT AUDITKY 
    FROM LSAUDIT
    WHERE ENTRYDT > '03-Nov-2019' AND ENTRYTM > '07:15:10'
  )
)

Существующий запрос (200 записей):

SELECT CINO, CLIENTID, COID, ADDRVER, ASSETFIX, AVEMONSALE, BRCHAFFL, BUS
  DESC, BUSTYPE, CAPITAL, CONTACT, FACCOND, FIXASSET, FIXTURE, INFADDR,
  INFORMANT, INVENTORY, LANDLORD, LASTYRSALE, LIABILITY, LINEPRDSRV,
  LOTAREA, MACHINE, MAJBAN, MAKE, MOTOR, NATINC, NUMEMPLOY, OBSERVE,
  OBSERVE2, OBTINFORM, OFFCAREA, OFFCBLDG, OFFCLOC, OFFCVALUE, OFFORG,
  OTHERINC, POSITION, RECEIVABLE, REGWITH, REMARKS, REMNEG, REMPOS, 
  RENTEXP, YRSOPER, YRINCOME, DATEORG, SUPPLIER 
FROM LCBINV 
WHERE CINO IN (
  SELECT CINO FROM LCMINV WHERE EXISTS (
    SELECT AUDITKY FROM LSAUDIT 
    WHERE ENTRYDT > '03-Nov-2019' AND ENTRYTM > '07:15:10'
  )
)

Итак, вотфункция моего запроса, он в основном проверяет наличие обновлений в информации об индивидууме, если ENTRYDT и ENTRYTM больше, чем дата и время последней проверки.

Моя проблема заключается в том, почему я получаю несколько записей по запросу EXISTS, даже если ENTRYDTне больше этой даты?

1 Ответ

4 голосов
/ 07 ноября 2019

Эти запросы совсем не похожи. Если это запрос in:

WHERE LCBINV.CINO IN (SELECT L2.CINO
                      FROM LCMINV L2
                      WHERE L2AUDITKY IN (SELECT A.AUDITKY 
                                          FROM LSAUDIT A
                                          WHERE A.ENTRYDT > DATE '2019-11-03'AND A.ENTRYTM > '07:15:10'
                                         )
                     )

Эквивалентный запрос с EXISTS в подзапросе будет выглядеть так:

WHERE LCBINV.CINO IN (SELECT L2.CINO
                      FROM LCMINV L2
                      WHERE EXISTS (SELECT 1
                                    FROM LSAUDIT A
                                    WHERE A.AUDITKY = L2.AUDITKY AND
                                          A.ENTRYDT > DATE '2019-11-03' AND
                                          A.ENTRYTM > '07:15:10'
                                   )
                     )

Другими словами, вы пропустите предложение корреляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...