工作所需查询数据,表中的是联合主键,即两个字段可以确认唯一一条数据,经过查询找到如下办法,mysql oracle均可执行,至于执行效率未知,有待考验。
原文地址:https://www.v2ex.com/t/430599
原原文地址(需要):https://dba.stackexchange.com/questions/34266/selecting-where-two-columns-are-in-a-set
测试案例
在mysql 和oracle中均测试可用,以下以mysql为例
建表以及模拟数据
CREATE TABLE ddd (
id int(11) default NULL,
batch_info varchar(255) default NULL,
name varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO ddd (id, batch_info, name)
VALUES
(1, '1', '1111'),
(2, '1', '1111'),
(3, '1', '1111'),
(4, '1', '1111'),
(5, '2', '2222'),
(6, '2', '2222'),
(7, '2', '2222'),
(8, '3', '3333'),
(9, '3', '3333'),
(1, NULL, '其他群体'),
(2, '3', '其他群体');
SQL
目标效果的sql
SELECT
*
FROM
ddd
WHERE
(id = 1 AND batch_info = 1)
OR (id = 2 AND batch_info = 1)
OR (id = 3 AND batch_info = 1)
OR (id = 5 AND batch_info = 2)
改造后
SELECT *
FROM ddd
WHERE (id, batch_info)
IN ((1, 1), (2, 1), (3, 1),(5, 2)) ;
改造的目的 是为了 在mybatis中查询,使用list 进行foreach进行查询,虽然 用OR也可以实现,但总觉不好看,嗯,对就是不好看,故改用后者办法。至于查询效率,有待考察。仅供参考。