sql - 查询外部表时优化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 语句的行为(这允许我执行检查然后分配新值)
谢谢你。
解决方案
如果 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)
——如果它是主键则更好。
推荐阅读
- r - 如何将 FITS 文件中的二进制表转换为 R 中的 CSV 文件?
- python-3.x - Numpy 1.11 未安装在 virtualenv @ Ubuntu Studio 中
- javascript - Vue - 导航到下一个子路线
- php - 在codeigniter中动态改变导航栏
- java - 如何分析 Snap.*trc 文件?
- javafx - Gdx.files.local NullPointerException
- spring - Spring数据elasticsearch + arangodb + spring boot
- java - 匹配以'开头的字符串的正则表达式
- angular - 如何更新angular2中按钮单击的数据?
- python - PyTorch:预测单个示例