【问题标题】:T-SQL column that indicates one or more records exist in a separate table指示一个或多个记录存在于单独表中的 T-SQL 列
【发布时间】:2016-11-23 19:05:12
【问题描述】:

我想要一个从 tableA 中选择 all 记录且不选择其他记录的查询。但是,我希望我的查询包含一列,表明 tableB 中存在 1 条或多条记录。

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

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

INNER JOIN 也失败了,因为我没有得到 tableA 中的 all 记录;只有那些在 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

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    由于我们的目标只是测试是否存在,因此我们强烈建议使用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 的解决方案,并且具有与您的问题陈述一致的语义的额外好处。

    【讨论】:

      【解决方案2】:

      您可以使用子查询:

      选择 表A.*, (select count(*) from tableB where tableA.ID=tableB.ID) as 'Count in TableB' 从表A

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

      【讨论】:

        【解决方案3】:

        您可以使用left join 并仅从 b: 中提取聚合数据:

        select a.id, cast(count(b.id) as bit) from a left join b on a.id = b.id group by a.id;
        

        example

        转换为 bit 会将任何非零值提升为 1。

        【讨论】:

        • 不确定是否有区别,但您可以使用 isnulll(select top 1 1 ... ,0) 来代替计算行数
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 2015-05-17
        相关资源
        最近更新 更多