【问题标题】:Check if table a primary key is exist in table b检查表b中是否存在表a主键
【发布时间】:2018-06-16 19:15:42
【问题描述】:

表 A: ID、姓名等

表 B: ID,表 A-ID。

SELECT * FROM A;

并且我想在此条件的相同结果中返回一个布尔值(如果 A.ID 存在于表 B 中)。

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。

标签: mysql sql node.js


【解决方案1】:

有几种方法可以满足您的需求。以下是三种可能性。这些都在执行计划以及数据库实际希望如何执行它们方面有所不同,因此根据您的记录计数,一个可能比另一个更有效。亲眼看看就更好了。


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
  )

【讨论】:

  • 非常感谢
【解决方案2】:
select A.*, IFNULL((select 1 from B where B.TableA-ID = A.ID limit 1),0) as `exists` from A;

如果键存在,上述语句将产生 1,如果该键不存在,则返回 0。如果 B 中有多个记录,则限制 1 很重要

【讨论】:

  • 非常感谢
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多