高效SQL查询:找出包含表B整行数据的表A的id
需求背景与问题
表结构
create table A { id text, val text } create table B { val0 text, val1 text, val2 text }
表数据说明
表A的id和val字段均包含大量离散值,二者为多对多关系,示例数据如下:
| id | val |
|---|---|
| one | a |
| one | b |
| one | y |
| two | a |
| two | d |
| two | e |
| two | x |
| three | c |
| four | c |
| four | f |
| four | z |
| four | g |
表B存储的是与表A的val同集合的组合数据,示例如下:
| val0 | val1 | val2 |
|---|---|---|
| a | b | c |
| a | d | e |
| c | f | g |
| z | f | c |
查询需求
编写SQL查询,返回且仅返回表A中满足以下条件的id:该id对应的所有val值中,至少包含表B中的某一整行数据。
在上述示例中,查询应返回id“two”(该id的分组包含表B第二行的所有值a、d、e,分组中包含x不影响结果),同时应返回id“four”(该id的分组覆盖表B的第三行和第四行数据)。表A和表B中的数据顺序不影响结果。
目前已通过存储过程实现该逻辑,现寻求适用于百万级数据量的简洁且高效的SQL查询语句。
附记
@Ajax1234和@GMB提供的方案(GMB的第二个不引入主键的方案)均有效,但在真实数据集上,@Ajax1234基于左连接的方案性能更优:耗时约9秒,而GMB的方案耗时超1分钟。
内容的提问来源于stack exchange,提问作者Peter K.
相关产品推荐
相关产品推荐

