返回表A中的列以及指定表B中是否存在表A的主键的位列的SQL查询
如何编写一个高效的SQL查询,返回表A中的列和一个指定表A的PK是否存在于表B中的位列?我使用的是MSSQLServer2005。谢谢。我假设表A中的主键称为PK,而B中包含此键的列也称为PK返回表A中的列以及指定表B中是否存在表A的主键的位列的SQL查询,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,如何编写一个高效的SQL查询,返回表A中的列和一个指定表A的PK是否存在于表B中的位列?我使用的是MSSQLServer2005。谢谢。我假设表A中的主键称为PK,而B中包含此键的列也称为PK SELECT A.*, CASE WHEN EXISTS (SELECT 1 FROM B WHERE B.PK = A.PK) THEN 1 ELSE 0 END FROM A 这个查询的效率将取决于表B中的索引——具体地说,就是列PK是否被索引 一般来说,我不喜欢SELECT*,但在本例中,它可以达
SELECT A.*, CASE WHEN EXISTS (SELECT 1 FROM B WHERE B.PK = A.PK) THEN 1 ELSE 0 END
FROM A
这个查询的效率将取决于表B中的索引——具体地说,就是列PK是否被索引
一般来说,我不喜欢SELECT*,但在本例中,它可以达到这个目的。其他答案指定了一个相关的子查询;(左外)联接可能更有效 我假设b.fk是b中a的pk的外键
select
a.*,
case when b.fk is not null then 1 else 0 end as exists_in_b
from
a
left outer join b on (a.id = b.fk )
;
这取决于外部表关系是1:1还是1:Many。如果是1:1,则可以使用普通联接:
select A.*, case when b.id is null then 0 else 1 end
from A
left join B on A.id = B.id;
如果关系是1:Many,那么连接将乘以结果,因此必须限制它,有几种方法。一种简单的方法是使用外部应用和顶部:
select A.*, case when b.id is null then 1 else 0 end
from A
outer apply (
select top (1) id from B where A.id = B.id) as b;
至于性能,只要B(id)上有适当的索引,几乎所有建议的解决方案都将执行相同的性能。谢谢,这正是我所需要的。我不知道外部应用功能,但是使用外部应用和使用distinct有什么区别?谢谢。所有有用的答案。我选择Remus的答案是因为它使用了左连接而不是子查询