在exists条件中使用union的输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在exists条件中使用union的输出相关的知识,希望对你有一定的参考价值。
我有三张桌子T1,T2,T3
我希望实现类似的目标
Select T1.X,T1.Y,
exists(
( select T2.Z from T2
union
select T3.Z from T3 ) Result where Result.Z=T1.Y
) from T1
SQL给了我syantx,请帮我如何实现这个结果?
T1 Contains
X Y
1 0
1 1
1 2
1 7
T2 Contains
Z
1
2
T3 Contains
3
4
T2和T3的联盟
1 2 3 4
现在检查T1是否包含这些行
OutPut
X Y Contains
1 0 True
1 1 True
1 2 True
1 7 False
答案
Select T1.X,T1.Y, ( select case when count(*)>0 then 'true' else 'false' end from
( select T2.Z from T2 union select T3.Z from T3 ) Result where Result.Z=T1.Y )
from T1
这将导致:
X Y (No column name)
1 1 0 false
2 1 1 true
3 1 2 true
4 1 7 false
看到这里:http://rextester.com/XDW34718(SQL-Server) 在这里:http://rextester.com/VXBN87216(mysql)
结果true
和false
实际上是字符串。据我所知,真正的布尔值通常由1
和0
表示。 exists
只允许作为where
条款的一部分。
或者你可以用两个count(*)
值之和来做
SQL-Server:http://rextester.com/GBKNRJ77523
Select x,y,
CAST ((select count(*) from t2 where z=y)
+(select count(*) from t3 where z=y) as bit) [Contains]
from T1
MySQL:http://rextester.com/AWOKZ51875
Select x,y,
(select count(*) from t2 where z=y)
+(select count(*) from t3 where z=y)>0 `Contains`
from T1
另一答案
我建议使用带有两个case
子句的exists
表达式:
Select t2.X, t1.Y,
(case when exists (select 1 from t2 where t2.z = t1.y then 1
when exists (select 1 from t3 where t3.z = t1.y then 1
else 0
end) as matches
from t1;
请注意,exists
在子查询中比count(*)
更好,因为它更快。首先,它可以很容易地利用指数(t2(z)
和t3(z)
)。其次,它可以在第一场比赛时停止。
以上是关于在exists条件中使用union的输出的主要内容,如果未能解决你的问题,请参考以下文章
sql server的exists,union,union all
detectron2报AttributeError: Attribute ‘evaluator_type‘ does not exist in the metadata of dataset(代码片段