在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/VXBN87216mysql

结果truefalse实际上是字符串。据我所知,真正的布尔值通常由10表示。 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的输出的主要内容,如果未能解决你的问题,请参考以下文章

将“UNION”与“IF EXISTS”一起使用

片段着色器输出干扰条件语句

sql server的exists,union,union all

java面试题目

在 JPQL 中可以选择 EXISTS() 吗?

detectron2报AttributeError: Attribute ‘evaluator_type‘ does not exist in the metadata of dataset(代码片段