Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在exists条件下使用union的输出_Sql - Fatal编程技术网

Sql 在exists条件下使用union的输出

Sql 在exists条件下使用union的输出,sql,Sql,我有三张桌子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

我有三张桌子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
这将导致:

    X   Y   (No column name)
1   1   0   false
2   1   1   true
3   1   2   true
4   1   7   false
请参见此处:(SQL Server)
这里:(MySql)

这里的结果
true
false
实际上是字符串。据我所知,实数布尔值通常由
1
0
表示。而
exists
仅允许作为
where
子句的一部分

或者,您可以使用两个
count(*)
值的总和来执行此操作,如

SQL Server:

MySQL:


我建议使用带有两个
exists
子句的
case
表达式:

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)
)。第二,它可以在第一场比赛时停止。

我不太清楚。是否需要第三列来告诉您是否有匹配的行?您使用的是哪一列?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签,
postgresql
oracle
db2
sql server
,…您能提供一些示例数据和预期结果吗?用example@The_learning_guy仍然不回答哪个dbms?在标准SQL中,
case-when-count(*)>0则'true'或'false'结束
可简化为
count(*)>0
@horse\u,名称:可能为true。我在sql server中进行了测试,但它不会被接受。顺便说一句:这是因为sql server没有真正的布尔数据类型(MySQL也没有)。在(标准)SQL中,实数布尔值表示为
true
false
Select x,y, 
  CAST ((select count(*) from t2 where z=y)
       +(select count(*) from t3 where z=y) as bit) [Contains]
from T1
Select x,y, 
  (select count(*) from t2 where z=y)
 +(select count(*) from t3 where z=y)>0 `Contains`
from T1
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;