加入或子查询“检测丢失的记录”?

时间:2012-04-01 22:17:56

标签: mysql sql

我很难让这个查询起作用。

我有2个包含国家/地区代码为'US'或'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 - 我尝试过加入但未能得到结果。

3 个答案:

答案 0 :(得分: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
;

但是你必须尝试看看哪一个表现最好。

答案 1 :(得分:0)

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

一些注意事项:

  1. 确保geo_world的索引涵盖cc
  2. 如果您需要定期执行此操作 - 您可能更好地对数据进行非规范化,并将未使用的国家/地区代码保存在另一个小的100或某些行表中,就像某种缓存一样

答案 2 :(得分:0)

您可以使用NOT EXISTS条件。你可以这样做:

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