从集合(mysql)中查找列中缺少的值

时间:2016-05-12 19:58:24

标签: mysql sql

我正在使用mysql。

我有一个包含列ID的表。

让我们说我有一组输入ID。我想知道表格中缺少哪些ID。

如果该组是" ida"," idb"," idc"并且该表仅包含" idb",则返回的值应为" ida"," idc"。

单个sql查询是否可以实现?如果没有,执行此操作的最有效方法是什么。

请注意,我不允许使用存储过程。

3 个答案:

答案 0 :(得分:2)

MySQL只会返回存在的行。要返回缺失的行,您必须有两个表。

第一个表可以是临时的(特定于会话/连接),这样多个实例可以同时运行。

create temporary table tmpMustExist (text id);
insert into tmpMustExist select "ida";
insert into tmpMustExist select "idb";
-- etc

select a.id from tmpMustExist as a
  left join table b on b.id=a.id
  where b.id is null; -- returns results from a table that are missing from b table.
  

单个SQL查询是否可以实现?

嗯,是的。让我按照自己的方式工作,首先使用union all来组合select语句。

create temporary table tmpMustExist (text id);
insert into tmpMustExist select "ida" union all select "idb" union all select "etc...";
select a.id from tmpMustExist as a left join table as b on b.id=a.id where b.id is null;

请注意,我使用的union allunion快一点,因为它会跳过重复数据删除。

您可以使用create table ... select。我经常这样做,非常喜欢它。 (这也是复制表的好方法,但它会删除索引。)

create temporary table tmpMustExist as select "ida" union all select "idb" union all select "etc...";
select a.id from tmpMustExist as a left join table as b on b.id=a.id where b.id is null;

最后,您可以使用所谓的“派生”表将整个事物放入单个可移植的select语句中。

select a.id from (select "ida" union all select "idb" union all select "etc...") as a left join table as b on b.id=a.id where b.id is null;

注意:as关键字是可选的,但澄清了我对ab所做的工作。我只是创建要在joinselect字段列表中使用的短名称

答案 1 :(得分:0)

//you can pass each set string to query
//pro-grammatically you can put quoted string
//columns must be utf8 collation

select * from
(SELECT 'ida' as col 
union  
SELECT 'idb' as col 
union  
SELECT 'idc' as col ) as setresult where col not in (SELECT value FROM `tbl`)

答案 2 :(得分:0)

这是一个技巧。您可以创建具有预期值的表,也可以为每个值使用多个选择联合。

然后你需要找到标准具中的所有值,但不是在测试表中。

CREATE TABLE IF NOT EXISTS `single` (
  `id` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `single` (`id`) VALUES
('idb');

SELECT a.id FROM (
   SELECT 'ida' as id
   UNION
   SELECT 'idb' as id
   UNION
   SELECT 'idc' AS id
) a WHERE a.id NOT IN (SELECT id FROM single)