exists
和 where 子句搭配使用,通过子查询过滤外查询。
语法
where [not] exists(subquery)
subquery:select / exec 语句,其过滤条件中可以包含外查询的字段。
详情
-
若子查询涉及到外查询的字段,即相关子查询:
-
先执行一遍外查询并缓存查询结果。
-
然后循环将外查询的每一行结果作为子查询的条件进行查询:
-
若子查询有返回结果,则 exists 子句返回 true,外查询的该行结果将作为最终结果输出;
-
否则 exists 子句返回 false,改行结果不输出。
-
-
-
若子查询和外查询无关,即不相关子查询,则 exists 将根据下述规则进行计算:
-
如果子查询结果集非空,输出所有外查询结果。
-
如果子查询结果集为空,则外查询结果为空。 not exists 的计算逻辑和 exists 相反。
-
注意:暂不支持在分布式查询中使用。
例子
t1 = table(`a`b`c`a`e`f as sym, 3.1 2.9 3.0 2.8 3.2 2.9 as val)
t2 = table(`a`b`c as sym, 0 1 -1 as flag)
查询1:相关子查询
select * from t1 where exists(select * from t2 where t1.sym in t2.sym)
sym | val |
---|---|
a | 3.1 |
b | 2.9 |
c | 3 |
a | 2.8 |
select * from t1 where not exists(select * from t2 where t1.sym in t2.sym)
sym | val |
---|---|
e | 3.2 |
f | 2.9 |
查询2:不相关子查询
select * from t1 where exists(select * from t2 where flag >= 0)
sym | val |
---|---|
a | 3.1 |
b | 2.9 |
c | 3 |
a | 2.8 |
e | 3.2 |
f | 2.9 |
select * from t1 where not exists(select * from t2 where flag >= 0)
//返回值为空
查询3:子查询无返回结果
select * from t1 where exists(select * from t2 where sym=`e)
//返回值为空
select * from t1 where not exists(select * from t2 where sym=`e)
sym | val |
---|---|
a | 3.1 |
b | 2.9 |
c | 3 |
a | 2.8 |
e | 3.2 |
f | 2.9 |