Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回表A中的列以及指定表B中是否存在表A的主键的位列的SQL查询_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

返回表A中的列以及指定表B中是否存在表A的主键的位列的SQL查询

返回表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*,但在本例中,它可以达

如何编写一个高效的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*,但在本例中,它可以达到这个目的。

其他答案指定了一个相关的子查询;(左外)联接可能更有效

我假设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的答案是因为它使用了左连接而不是子查询