首页 > 解决方案 > 查询外部表时优化CASE语句中的条件子句

问题描述

我有 02 表如下:

表A:

ID 姓名 状态
1 一种 2
2 2
3 C 2

表B:

ID
1
3

我要做的是执行SELECT查询,如果表A中的Id也在表B中,则设置状态= 0,否则为1

SELECT
    ID,
    Name,
    CASE WHEN a.Id IN (SELECT * FROM TableB) THEN 0 ELSE 1 END AS State,
FROM TableA as a

预期输出为:

ID 姓名 状态
1 一种 0
2 1
3 C 0

我给定的查询按预期工作,但我想知道我的方式是否是最佳方式。特别是在这部分:

a.Id IN (SELECT * FROM TableB)

因为据我了解, tableA 中的每个 Id 都需要进行检查,当发生这种情况时,Table B 中的所有 Id 都将被一遍又一遍地查询。这听起来对我来说并不友好。

在这种情况下,您会建议什么来提高查询性能?我尝试使用 JOIN,但我无法模仿 CASE 语句的行为(这允许我执行检查然后分配新值)

谢谢你。

标签: sqlcase

解决方案


如果 id 在 中是唯一的B,那么您可以使用:

select a.*,
       (case when b.id is not null then 0 else 1 end) as state
from a left join
     b
     on a.id = b.id;

对于此查询或您的查询版本的性能,您需要一个索引b(id)——如果它是主键则更好。


推荐阅读