如何在SQL中正确使用EXISTS和IN

用户名

我正在使用EXISTS和IN比较两个查询。他们都给出不同的结果。当我使用IN进行查询时,结果是正确的,但是当使用EXISTS查询时,我将获得多条记录,应该只有1条记录。

基准测试:
IN查询-17秒以获取结果
EXISTS查询-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是否大于上次检查的日期和时间,个人信息中是否有更新。

我的问题是,即使ENTRYDT不大于日期,为什么我仍在EXISTS查询上获得多个记录?

戈登·利诺夫

这些查询根本不相似。如果这是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'
                                   )
                     )

换句话说,您缺少相关子句。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章