【发布时间】:2017-07-23 11:03:43
【问题描述】:
我创建了两个表,如下所示:
create table table1(
id number(10) not null,
constraint table1_pk primary key (id)
);
create table table2(
table1_id number(10) not null,
x number(10) not null,
constraint table1_fk foreign key (table1_id) references table1(id)
);
接下来,我将一些随机数据插入到这两个表中。 table1 包含从 1 到 1000 的所有 ID,table2 在 table1_id 字段中包含来自 table1 的 id,在 x 字段中包含 0 到 2 之间的随机数。每个 table1_id 可以有多行,但每个 x 值只能有一次。因此 table2 看起来像这样:
TABLE1_ID X
1 0
1 1
2 0
2 2
3 0
4 2
5 0
6 2
7 2
8 0
8 1
我想从 table1 中选择所有行,其中 table2 中的匹配 table1_id 在 x 列中既没有 1s 也没有 2s(对于上面的示例,结果应该只包含 id 3 和 id 5)。但是,如果我将数字 3 添加到 x 的可能选项中,则正确的结果将包括所有具有 0 或 3 且不具有 1 或 2 的字段。
下面的查询做了我想要的,但不幸的是它太慢了:
select * from table1 where id not in (select t1.id from table1 t1 join table2 t2 on t1.id = t2.table1_id where t2.x = 1 or t2.x = 2);
无论如何,我都不是 SQL 专家,但我很确定有一种更快的方法可以做到这一点,可能是通过不同的连接或添加索引(我尝试过,但没有帮助)。也许更专业的人可以帮助我找到解决方案。
提前致谢!
编辑:由于我现在尝试了一些查询,并且所有查询都花费了大约相同的时间(0.8 秒),我还有另一个问题:table1 有 1000 行,table2 有 1569 行。 0.8s真的合理吗?
【问题讨论】: