2014-01-13 147 views
0

我可以知道为什么以下2个查询返回不同的值。我想要第一个使用LEFT OUTER JOIN的确切结果。请帮忙。DB2:NOT EXISTS和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 
); 

回答

0

这里有两方面的原因:

(1)您在获取行的数量有限,没有order by条款。行可以以任意顺序返回,并且前两个查询的前800,000可能不相同。

(2)一个或多个连接有多个匹配。这会导致结果集中出现重复。

+0

我想要使用LEFT OUTER JOIN的第一个查询的确切的同上。你能帮我吗? – Samy

+0

@ user3175639。 。 。为什么?以这种方式构建一个相当复杂的查询,并且您已经有了它。 –