我正在使用mysql。
我有一个包含列ID的表。
让我们说我有一组输入ID。我想知道表格中缺少哪些ID。
如果该组是" ida"," idb"," idc"并且该表仅包含" idb",则返回的值应为" ida"," idc"。
单个sql查询是否可以实现?如果没有,执行此操作的最有效方法是什么。
请注意,我不允许使用存储过程。
答案 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 all
比union
快一点,因为它会跳过重复数据删除。
您可以使用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
关键字是可选的,但澄清了我对a
和b
所做的工作。我只是创建要在join
和select
字段列表中使用的短名称
答案 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)