给定两个表a
和b
,我想对a
执行一个查询,该查询给出b
中至少有一行包含b.a_id = a.id
和flag=1
以及至少有一行包含b.a_id = a.id
和flag=0
的行.
我有一个解决方案(见下文),但我想知道是否有人知道更优雅/有效的解决方案?
这里的示例是我的实际数据集的简化和提炼版本.实际上,表‘a’有数百万行,并且有相关的索引.
CREATE table a (
id int unsigned NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE b (
id int unsigned NOT NULL AUTO_INCREMENT,
a_id int unsigned NOT NULL,
flag tinyint NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO a VALUES (1),(2),(3),(4);
INSERT INTO b (a_id, flag) VALUES
(1,0),(1,1),(1,1),
(2,0),(2,1),(2,0),
(3,1),
(4,0);
select * from a;
id |
---|
1 |
2 |
3 |
4 |
从b中 Select *;
id | a_id | flag |
---|---|---|
1 | 1 | 0 |
2 | 1 | 1 |
3 | 1 | 1 |
4 | 2 | 0 |
5 | 2 | 1 |
6 | 2 | 0 |
7 | 3 | 1 |
8 | 4 | 0 |
查询的预期结果:
id |
---|
1 |
2 |
当前解决方案:
select * from a where
exists (select * from b where a_id = a.id and flag = 1)
and exists (select * from b where a_id = a.id and flag = 0);