代码之家  ›  专栏  ›  技术社区  ›  Rajesh Omanakuttan SpringLearner

基于group by条件的sql查询选择

  •  0
  • Rajesh Omanakuttan SpringLearner  · 技术社区  · 7 年前

    我有一个 批处理 实体与A 工作 实体。一个批可以有许多作业。

    现在,job有一个名为 'status' 带值 'REVIEW', 'NEW', 'EDIT' 'QA' .

    我需要选择具有值的所有批 'YES' 如果属于这些批次的任何作业具有 'REVIEW' 'NO' 如果没有作业具有 “审查” 查询将按批分组。

    Select Batches.name, Batches.<column_I_need>, Batches.user_id
    INNER JOIN Jobs ON Jobs.batch_id = Batches.id
    GROUP BY Batches.id;
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Tim Biegeleisen    7 年前

    使用条件聚合检查您的要求:

    SELECT
        b.id,
        b.name,
        b.user_id,
        CASE WHEN SUM(CASE WHEN j.status = 'REVIEW' THEN 1 ELSE 0 END) > 0
             THEN 'YES'
             ELSE 'NO' END AS status
    FROM Batches b
    INNER JOIN Jobs j
        ON j.batch_id = b.id
    GROUP BY
        b.id;
    

    假设 Batches.id 作为该表的主键列,如果 GROUP BY 我们还可以从 Batches 表。

        2
  •  1
  •   Gordon Linoff    7 年前

    我会用 case exists :

    Select b.name, b.user_id,
           (case when exists (select 1
                              from jobs j
                              where j.batch_id = b.id and j.status = 'Review'
                             )
                 then 'Yes' else 'No'
            end) as status
    from batches b;
    

    这种方法比聚合方法更有效,因为它消除了 group by . 上有索引 jobs(batch_id, status) ,这将具有最佳性能。