如何编写一个有效的SQL查询,它返回表格A的列加上一个位列,指定表A中的表A的PK是否存在?我正在使用MS SQLServer 2005.谢谢。
答案 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 *,但是对于这个例子,它可以达到目的。