DB2:NOT EXISTS和LEFT OUTER JOIN

时间:2014-01-13 22:43:50

标签: sql left-join

我可以知道为什么以下2个查询返回不同的值。我希望使用LEFT OUTER JOIN作为第一个确切的结果。请帮忙。

select count(a.ADDRESS_ID) from ADDRESS a where a.MEMBER_ID >= 50000000 and a.MEMBER_ID <= 999999999 and a.STATUS='T' and a.LASTCREATE < (current timestamp - 42 days) 
    and not exists (select 1 from ORDERS o where o.ADDRESS_ID = a.ADDRESS_ID) 
    and not exists (select 1 from ORDERITEMS oi where oi.ADDRESS_ID = a.ADDRESS_ID or oi.ALLOCADDRESS_ID = a.ADDRESS_ID) 
    and not exists (select 1 from HD_MEMBER_SUBSCR ms where ms.ADDRESS_ID = a.ADDRESS_ID) 
fetch first 800000 rows only for read only with ur;


select count(ADDRESS_ID) FROM ADDRESS
WHERE MEMBER_ID >= 50000000 
  AND MEMBER_ID < 999999999
  AND STATUS = 'T'
  AND LASTCREATE < (CURRENT_TIMESTAMP - 42 DAYS)
  AND ADDRESS_ID IN (
    SELECT a.ADDRESS_ID
    FROM ADDRESS a
    LEFT OUTER JOIN ORDERS o
      ON o.ADDRESS_ID = a.ADDRESS_ID AND o.ADDRESS_ID IS NULL
    LEFT OUTER JOIN ORDERITEMS oi
      ON oi.ADDRESS_ID = a.ADDRESS_ID AND oi.ADDRESS_ID IS NULL
    LEFT OUTER JOIN ORDERITEMS oi2
      ON oi2.ALLOCADDRESS_ID = a.ADDRESS_ID AND oi2.ALLOCADDRESS_ID IS NULL
    LEFT OUTER JOIN HD_MEMBER_SUBSCR hms
      ON hms.ADDRESS_ID = a.ADDRESS_ID AND hms.ADDRESS_ID IS NULL
  FETCH FIRST 800000 ROWS ONLY
);

1 个答案:

答案 0 :(得分:0)

以下是两个原因:

(1)您正在获取没有order by子句的有限行数。可以按任何顺序返回行,并且两个查询的前800,000可能不同。

(2)一个或多个联接有多个匹配。这将导致结果集中的重复。