如何使用条件联接优化查询?

迭戈DD

我需要优化查询,其中联接取决于条件

我有两张桌子

Table1有两列,可以将它们称为A和B列,它们可以与table2列C有关,

如果列B为空,则必须将t1.A与t2.C匹配如果列B不为空,则必须将t1.B与t2.C匹配

最后我需要知道t1上的哪些条目在t2上不匹配...

更详细地说,t1是客户表,A和B都是客户代码。A代码永远不会与B代码相同,并且在存在B的情况下,B具有优先权(B是新的客户代码,而旧客户则没有)。在B为空的情况下,A是代码(因为B列是新列,而旧客户端的B值为空)。

t2是一张购买表。t2.C是客户端代码,但在这种情况下是单个列,它存储旧客户端的A代码和新客户端的B代码。

我唯一想做的就是知道哪个客户还没有购买商品,并尽可能高效地进行查询。

我提出了几个查询,但是由于条件的处理方式,它们非常慢,我想:

第一次尝试:

select * 
from t1
left join t2 on (t1.A = t2.C or t1.B = t2.C)
where t2.D is null;

请注意,我可以使用OR条件,因为我知道t1.A永远不会与任何t1.B相同,因此在t2.C中,它只能与A或B匹配,但绝不会与两者匹配(假定条件是保证)。查询是如此缓慢,以至于在我的sql客户端中超时。

第二次尝试

select * 
from t1
left join t2 on (if(t1.B is null, t1.A = t2.C, t1.B = t2.C))
where t2.D is null;

在这种情况下,比较条件取决于t1.B,如果为null,则与A进行比较,如果不为B,则与B进行比较。同样,查询非常慢。

我想我可以只使用两个联接,并为每个联接使用每个条件(A或B),但我不知道确切如何实现,特别是因为我只需要获得A o B都没有的情况t2比赛。(即,没有t2购买的t1客户)

在这种情况下,我有什么选择来建立更有效的查询?

谢谢

加雷斯

如果您没有索引,t1.A或者t1.B我怀疑IFNULL将是您最好的选择:

select * 
from t1
left join t2 on ifnull(t1.B, t1.A) = t2.C
where t2.D is null;

但是,如果任一列都已建立索引,我怀疑您可以通过使用UNION ALL以下命令获得最佳性能

select * 
from t1
left join t2 on t1.A = t2.C
where t2.D is null
and t1.B is null
union all
select * 
from t1
left join t2 on t1.B = t2.C
where t2.D is null
and t1.B is not null;

原因是在编译期间,优化器将不知道是使用t1.A还是t1.B用于联接,因此无法选择索引,而是选择进行表扫描,但是如果将其分成两个查询,它将知道在联接上使用哪一列,并可以使用适当的索引。

SQL小提琴上的示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用表联接优化此查询?

来自分类Dev

如何使用自联接优化此查询?

来自分类Dev

在左联接中使用子查询时如何优化查询

来自分类Dev

使用联接优化 SQL 查询

来自分类Dev

如何使用10个以上的联接优化查询?

来自分类Dev

如何使用多个左联接优化SQL查询

来自分类Dev

使用内部联接时如何优化Doctrine查询的数量?

来自分类Dev

如何使用两个内部联接优化查询

来自分类Dev

使用左联接优化MySql查询

来自分类Dev

如何在MySQL中使用子查询为报表优化多个联接的查询

来自分类Dev

查询优化(多个联接)

来自分类Dev

如何优化包含联接和子查询的查询

来自分类Dev

使用子查询进行查询并进行联接优化

来自分类Dev

如何在给定查询中使用内部联接并对其进行优化?

来自分类Dev

如何用联接条件重写查询NOT IN

来自分类Dev

如何为大型数据集(数百万行)使用联接和子查询优化MySQL查询

来自分类Dev

MySQL:使用条件联接改善查询

来自分类Dev

如何优化多个左联接SQL SELECT查询?

来自分类Dev

如何优化这个极其缓慢的左外部联接sqlite查询?

来自分类Dev

如何优化此MYSQL查询-联接多个表

来自分类Dev

如何优化大表上的左联接查询

来自分类Dev

使用多个表的条件优化查询

来自分类Dev

使用并集和条件优化SQl查询

来自分类Dev

使用多个“介于”条件优化查询

来自分类Dev

使用多个联接和谓词优化LINQ查询

来自分类Dev

使用多个联接和分组优化SQL查询(Postgres 9.3)

来自分类Dev

使用左联接优化Mysql查询组Concat

来自分类Dev

使用左联接在多个表上优化SQL查询

来自分类Dev

内部联接和查询优化

Related 相关文章

热门标签

归档