logo
GBase 8s
性能调优
文章

GBase8s 多列IN改写 简述

GBase社区管理员
发表于2024-04-23 09:36:00172次浏览0个评论

准备测试数据

create table tab1(id1 int, id2 int, c varchar(10));
create table tab2(id1 int, id2 int, c varchar(10));

insert into tab1 values(1, 1, 'line1');
insert into tab1 values(2, 2, 'line2');
insert into tab1 values(3, 3, 'line3');
insert into tab1 values(2, 1, 'line4');
insert into tab1 values(1, 2, 'line5');
insert into tab1 values(3, 1, 'line6');
insert into tab1 values(1, 4, 'line7');
insert into tab1 values(7, 1, 'line8');
insert into tab1 values(1, 7, 'line9');

insert into tab2 values(1, 1, 'line1');
insert into tab2 values(2, 2, 'line2');
insert into tab2 values(2, 1, 'line3');
insert into tab2 values(3, 1, 'line4');
insert into tab2 values(1, 2, 'line5');
insert into tab2 values(1, 4, 'line6');
insert into tab2 values(3, 1, 'line7');
insert into tab2 values(2, 1, 'lien8');
insert into tab2 values(1, 3, 'line9');
insert into tab2 values(1, 2, 'line10');

多列in

查询逻辑可以理解成遍历tab1的id1和id2列,如果tab2中有任意一行存在相同的id1和id2,则输出tab1的该行

select tab1.* from tab1 where (id1, id2) in (select id1, id2 from tab2);

 

正确改写方法

使用exists子句

SELECT tab1.* FROM tab1 WHERE EXISTS (SELECT 1 FROM tab2 WHERE tab1.id1 = tab2.id1 AND tab1.id2 = tab2.id2);

 

第一种错误改写方法

可以理解成,分别遍历tab1的id1和id2,分别和tab2的id1和id2对比取等值行,再取交集,从结果可以看到多了line3这行

select tab1.* from tab1 where id1 in (select id1 from tab2) and id2 in (select id2 from tab2);

 

第二种错误改写方法

使用join连接查询,一般情况下没有问题,但是如果tab2的id1、id2有多行和tab1的id1、id2相等,查询出来的结果集会增大,在这个例子里是有重复数据

select tab1.* from tab1 join tab2 on tab1.id1 = tab2.id1 and tab1.id2 = tab2.id2;

 

评论

登录后才可以发表评论