我想要一个从 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
答案 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 NULL
或COUNT
的解决方案,还具有与您的问题陈述一致的语义的额外好处
答案 1 :(得分:2)
您可以使用子查询:
选择 表A *, (从tableB中选择count(*)表tableA.ID = tableB.ID)作为&#39;表B中的计数&#39; 来自tableA
如果需要,可以在子查询周围包装条件语句或case语句,以便为您提供更多的布尔值。
答案 2 :(得分:2)
您可以使用Test2.idr
并仅从b:
left join
转换为select a.id, cast(count(b.id) as bit) from a left join b on a.id = b.id group by a.id;
会将任何非零值提升为1.