2014-09-24 75 views
0

我創建了一個查詢,我相信,無論如何,我都會返回表1中的所有電子郵件地址。左連接邏輯不如預期

如果我去SELECT COUNT(email), COUNT(DISTINCT email) contacts.sid208我得到心目中200000 175000.

有了這個,用左聯接從下面的查詢結果的電子郵件的數量應該是一樣的沒有?

SELECT 
    COUNT(email), COUNT(DISTINCT email) 
FROM 
    (SELECT 
     co.email, 
      env.env_medium, 
      CAST(MIN(co.created) AS DATE) AS first_contact, 
      MIN(CASE 
       WHEN my.my_id = 581 THEN my.data 
      END) AS Created, 
      MIN(CASE 
       WHEN my.my_id = 3347 THEN my.data 
      END) AS Upgraded 
    FROM 
     contacts.sid208 co 
    LEFT JOIN contacts.my208 my ON co.id = my.eid 
    LEFT JOIN contacts.env208 env ON env.eid = co.id 
    WHERE 
     my_id = 581 OR my_id = 3347 
    GROUP BY email) b1 

但這裏的結果,如果我堅持的東西相稱,是150000,而150000

我希望的結果是175000.

我LEFT JOIN的理解是,從通訊錄中的所有記錄.sid208將被保留,無論它們是否出現在my208或env208中。

我的理解是否有缺陷?希望我的問題對民間人士有意義,如果有更多的信息可以補充,讓我的問題更清楚地告訴我。

+2

什麼表有字段,my_id? – 2014-09-24 16:09:19

+0

對不起,my208有這個字段my_id – 2014-09-24 16:58:21

回答

2

對於左連接,移動條件下的連接,以及:

SELECT 
    COUNT(email), COUNT(DISTINCT email) 
FROM 
    (SELECT 
     co.email, 
      env.env_medium, 
      CAST(MIN(co.created) AS DATE) AS first_contact, 
      MIN(CASE 
       WHEN my.my_id = 581 THEN my.data 
      END) AS Created, 
      MIN(CASE 
       WHEN my.my_id = 3347 THEN my.data 
      END) AS Upgraded 
    FROM 
     contacts.sid208 co 
    LEFT JOIN contacts.my208 my 
     ON co.id = my.eid 
     AND (my_id = 581 OR my_id = 3347) 
    LEFT JOIN contacts.env208 env ON env.eid = co.id 
    GROUP BY email) b1 

如果你不這樣做,你會首先執行加入,從而從sid208,所有行不分,與缺少電子郵件的值爲null。但是,然後在where子句中進行過濾,並且無論如何都會刪除這些記錄。

當你把所有這些條件的加盟,你會得到所有行,以及電子郵件只加入時,他們有匹配的聯繫人ID,和自己的ID或者是581或2247

+0

非常感謝你解決了我的問題。現在我想到它也是有道理的。再次感謝 – 2014-09-24 17:03:36