有几种方法可以满足你的需要。以下是三种可能性。这些都在执行计划和数据库实际希望执行它们的方式上有所不同,因此根据您的记录计数,一个可能比另一个更有效率。最好你自己看看。 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
)
2条答案
按热度按时间lx0bsm1f1#
如果该键存在,上面的语句将生成1,如果该键不存在,则生成0。如果b中有多个记录,则限制1很重要
l2osamch2#
有几种方法可以满足你的需要。以下是三种可能性。这些都在执行计划和数据库实际希望执行它们的方式上有所不同,因此根据您的记录计数,一个可能比另一个更有效率。最好你自己看看。
1) 使用
LEFT JOIN
并检查b中的非空字段是否为非空,以确保记录存在。然后申请DISTINCT
子句if relationship为1:n以仅显示来自的行,而不显示重复的行。2) 使用
exists()
函数,将对从表a返回的每一行进行求值。3) 使用子查询表达式的组合
EXISTS
在两个查询中,检查表b中的记录是否匹配是矛盾的。那么UNION ALL
将两个结果合并为一个。