2012-04-01 65 views
0

我很努力使這個查詢工作。加入或子查詢以「檢測丟失的記錄」?

我有2個表包含國家代碼是'美國'或'AU'或'JP' - 這是一個共同的關鍵。

SELECT DISTINCT cc FROM geo_world; SELECT cc FROM geo_country;

注意:geo_world是一個包含數百萬個條目但僅有124個不同cc值的大表。

注意:geo_country只包含244個cc值。

我想找出geo_country中沒有顯示在geo_world中的cc值。應該有120個。

thankyou - 我試過連接,但沒有得到結果。

+0

我傾向於JOINS在子查詢,因爲他們通常是「適合我的頭好」。我不確定MySQL查詢規劃器今天是如何工作的,但它真的應該在2012年處理這些簡單的案例... – 2012-04-01 22:40:54

回答

4

原則上,任何這些應該工作:

SELECT cc 
    FROM geo_country 
WHERE cc NOT IN 
     (SELECT cc     -- or SELECT DISTINCT cc 
      FROM geo_world 
     ) 
; 

SELECT cc 
    FROM geo_country 
WHERE NOT EXISTS 
     (SELECT 1 
      FROM geo_world 
      WHERE cc = geo_country.cc 
     ) 
; 

SELECT geo_country.cc 
    FROM geo_country 
    LEFT 
OUTER 
    JOIN geo_world 
    ON geo_world.cc = geo_country.cc 
WHERE geo_world.cc IS NULL    -- i.e., the join failed 
; 

但是你必須嘗試看看哪一個表現最好。

0
SELECT DISTINCT cc 
FROM geo_world 
WHERE cc NOT IN (SELECT cc FROM geo_country) 

一些注意事項:

  1. 確保geo_world具有覆蓋cc
  2. 如果您需要做的定期索引 - 你可能會更好,非規範化的數據,並保持未使用countrycodes在另一個小的100或一些行表,就像某種緩存
0

您可以使用NOT EXISTS條件。你可以這樣做是這樣的:

SELECT cc FROM geo_country WHERE 
NOT EXISTS (SELECT * from geo_world WHERE geo_world.cc = geo_country.cc);