检查表b中是否存在表a主键

8fq7wneg  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(487)

表a:id、名称等。
表b:id,表A-id。

SELECT * FROM A;

对于这个条件,我想在相同的结果中返回一个布尔值(如果表b中存在a.id)。

lx0bsm1f

lx0bsm1f1#

select A.*, IFNULL((select 1 from B where B.TableA-ID = A.ID limit 1),0) as `exists` from A;

如果该键存在,上面的语句将生成1,如果该键不存在,则生成0。如果b中有多个记录,则限制1很重要

l2osamch

l2osamch2#

有几种方法可以满足你的需要。以下是三种可能性。这些都在执行计划和数据库实际希望执行它们的方式上有所不同,因此根据您的记录计数,一个可能比另一个更有效率。最好你自己看看。
1) 使用 LEFT JOIN 并检查b中的非空字段是否为非空,以确保记录存在。然后申请 DISTINCT 子句if relationship为1:n以仅显示来自的行,而不显示重复的行。

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
  )

相关问题