从表A返回列的SQL查询加上一个位列,指定表A中是否存在表A的PK

时间:2010-05-21 19:21:26

标签: sql sql-server sql-server-2005

如何编写一个有效的SQL查询,它返回表格A的列加上一个位列,指定表A中的表A的PK是否存在?我正在使用MS SQLServer 2005.谢谢。

3 个答案:

答案 0 :(得分:1)

其他答案指定相关子查询; a(左外)联接可能更有效。

我假设b.fk是b到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:1还是1:很多。如果是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:多次则连接将乘以结果,因此您必须限制它,并且有几种方法。一种简单的方法是使用外部应用和顶部:

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)索引,几乎所有提议的解决方案都会执行相同的操作。

答案 2 :(得分:0)

我假设表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 *,但是对于这个例子,它可以达到目的。