指示一个或多个记录的T-SQL列存在于单独的表

时间:2016-07-20 13:43:48

标签: sql-server tsql

我想要一个从 tableA 中选择所有记录的查询,而不是其他记录。但是,我希望我的查询包含一个列,指示 tableB 中存在1个或多个记录。

LEFT OUTER JOIN tableA到tableB不起作用,因为如果tableB中有2条与tableA中的记录相关的记录,我在结果集中得到2条记录。我只想要1。

RIGHT OUTER JOIN不起作用,因为我的查询返回tableB中与tableA中的任何记录都不匹配的所有记录。我不想从tableB获取与tableA中至少1条记录不匹配的记录。

INNER JOIN也失败了,因为我没有获得tableA中所有的记录;只有那些在tableB中包含匹配记录的那些。

好像我需要这样的查询:

SELECT tableA.ID, IF EXISTS row in tableB THEN 1 ELSE 0 
FROM tableA <some sort of join> tableB on tableA.ID = tableB.FKtoTableA

3 个答案:

答案 0 :(得分:3)

由于目标只是测试存在,因此我们强烈建议在线使用EXISTS子句:

SELECT A.*
     , CASE
           WHEN EXISTS (
               SELECT 1
               FROM TableB B
               WHERE B.Id = A.Id
           ) THEN 1
           ELSE 0 
       END 
FROM TableA A

typically going to be faster不仅仅是采用LEFT JOIN + IS NOT NULLCOUNT的解决方案,还具有与您的问题陈述一致的语义的额外好处

答案 1 :(得分:2)

您可以使用子查询:

选择 表A *, (从tableB中选择count(*)表tableA.ID = tableB.ID)作为&#39;表B中的计数&#39; 来自tableA

如果需要,可以在子查询周围包装条件语句或case语句,以便为您提供更多的布尔值。

答案 2 :(得分:2)

您可以使用Test2.idr并仅从b:

中提取汇总数据
left join

example

转换为select a.id, cast(count(b.id) as bit) from a left join b on a.id = b.id group by a.id; 会将任何非零值提升为1.