Sql 在exists条件下使用union的输出
我有三张桌子T1,T2,T3 我想达到这样的目标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
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;