如何解决查询外部表时优化CASE语句中的条件子句
我有 02 个表如下:
表A:
ID | 姓名 | 状态 |
---|---|---|
1 | A | 2 |
2 | B | 2 |
3 | C | 2 |
表B:
ID |
---|
1 |
3 |
我想做的是执行一个SELECT查询,如果表A中的Id也在表B中,则设置state = 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 | A | 0 |
2 | B | 1 |
3 | C | 0 |
我给定的查询按预期工作,但我想知道我的方式是否是最佳方式。特别是在这部分:
a.Id IN (SELECT * FROM TableB)
据我所知,tableA 中的每一个 Id 都需要检查,当这种情况发生时,Table B 中的所有 Id 都会被一遍又一遍地查询。这对我来说听起来不太友好。
在这种情况下,您有什么建议可以提高查询性能?我尝试使用 JOIN,但我无法模仿 CASE 语句的行为(这允许我执行检查然后分配新值)
谢谢。
解决方法
如果 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)
上建立索引——如果它是主键则更好。
将您的选择从 tableB 移动到连接,以获得更好的性能。按照您编写查询的方式,它将为外部选择查询返回的每一行执行选择中的选择语句。
使用连接只会执行一次并更有效地获得结果。这样的事情......
SELECT
a.ID,a.Name,CASE WHEN b.ID IS NOT NULL THEN 0 ELSE 1 END AS [State]
FROM TableA a
LEFT JOIN TableB b ON a.id = b.id
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。