【发布时间】:2018-06-16 19:15:42
【问题描述】:
表 A: ID、姓名等
表 B: ID,表 A-ID。
SELECT * FROM A;
并且我想在此条件的相同结果中返回一个布尔值(如果 A.ID 存在于表 B 中)。
【问题讨论】:
-
编辑您的问题并提供示例数据和所需的结果。
表 A: ID、姓名等
表 B: ID,表 A-ID。
SELECT * FROM A;
并且我想在此条件的相同结果中返回一个布尔值(如果 A.ID 存在于表 B 中)。
【问题讨论】:
有几种方法可以满足您的需求。以下是三种可能性。这些都在执行计划以及数据库实际希望如何执行它们方面有所不同,因此根据您的记录计数,一个可能比另一个更有效。亲眼看看就更好了。
1) 使用LEFT JOIN 并检查来自B 的非空字段是否不为空,以确保记录存在。如果关系为 1:N,则应用 DISTINCT 子句以仅显示来自 A 的行而不显示重复。
select distinct a.*, b.id is not null as exists_b
from a
left join b on
a.id = b.tablea-id
2) 使用exists() 函数,该函数将对从表 A 返回的每一行进行评估。
select a.*, exists(select 1 from b where a.id = b.tablea-id) as exists_b
from a
3) 使用子查询表达式EXISTS的组合,在两个查询中检查记录是否在表B中匹配。然后UNION ALL将两个结果结合起来合二为一。
select *, true as exists_b
from a
where exists (
select 1
from b
where a.id = b.tablea-id
)
union all
select *, false as exists_b
from a
where not exists (
select 1
from b
where a.id = b.tablea-id
)
【讨论】:
select A.*, IFNULL((select 1 from B where B.TableA-ID = A.ID limit 1),0) as `exists` from A;
如果键存在,上述语句将产生 1,如果该键不存在,则返回 0。如果 B 中有多个记录,则限制 1 很重要
【讨论】: