2017-10-13 20 views
0

我有這樣的查詢使用左連接替代的子查詢不在IN中?

SELECT f.ACCOUNT_ID, 
     f.TGL, 
     p.ACCOUNT_EMAILADDRESS 


    FROM distributor_kokola.forecast f 
     inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID 
     where f.ACCOUNT_ID NOT IN(

       select ACCOUNT_ID 
         from distributor_kokola.forecast 
         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m") 
         group by ACCOUNT_ID 


    ) 

     group by f.ACCOUNT_ID; 

該子查詢的工作,但要慢,所以我用左改變它加入,它工作得更快

SELECT f.ACCOUNT_ID, 
     f.TGL, 
     p.ACCOUNT_EMAILADDRESS 


    FROM distributor_kokola.forecast f 
     left join(

       select ACCOUNT_ID 
         from distributor_kokola.forecast 
         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m") 
         group by ACCOUNT_ID 


    )subb on subb.ACCOUNT_ID = f.ACCOUNT_ID 

     inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID 
     group by f.ACCOUNT_ID; 

不過,我的問題仍然含有錯誤的結果,

With Not IN,查詢1選擇NOT IN查詢2的位置。

如何獲取像NOT IN查詢中的左連接。

任何人都可以幫助我嗎?

謝謝。

回答

1

你必須添加一個WHERE子句來篩選LEFT JOIN的結果。如果添加適當的WHERE子句WHERE subb.ACCOUNT_ID IS NULL,應該按預期工作(因爲你用在你的子查詢中GROUP BY,沒有重複行的危險):

SELECT f.ACCOUNT_ID, 
     f.TGL, 
     p.ACCOUNT_EMAILADDRESS 
    FROM distributor_kokola.forecast f 
     left join(
       select ACCOUNT_ID 
         from distributor_kokola.forecast 
         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m") 
         group by ACCOUNT_ID 
    ) subb on subb.ACCOUNT_ID = f.ACCOUNT_ID 
     inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID 
     WHERE sub.ACCOUNT_ID IS NULL 
     group by f.ACCOUNT_ID; 

更新

的目標我們LEFT JOIN用於查找forecast表中在子查詢中沒有匹配行的所有行。因此,我們需要一個WHERE子句,它可以刪除具有匹配行的所有行 - WHERE sub.ACCOUNT_ID IS NULL非常適合。

SO用戶@quassnoi已經寫了wonderful comparison of different methods來實現這個目標。

+0

嘿它的工作就像一個魅力,但我仍然沒有得到它,爲什麼「WHERE subb.ACCOUNT_ID是NULL」? – Uchsun

+0

親愛的@Uchsun試着學習左邊的小表,然後你會很容易地得到 –

+0

@Uchsun我已經更新了我的答案並添加了一個簡短的解釋。希望現在更清楚。 –