代码之家  ›  专栏  ›  技术社区  ›  Paul Tomblin

如果左连接返回任何行,那么返回“1”的更好方法是什么?

  •  6
  • Paul Tomblin  · 技术社区  · 14 年前

    我有三张桌子,“A”,“B”和“C”。我对'A'和'B'有查询,但我想添加一个字段,告诉我是否有一个或多个(我不关心有多少个)'C'是外键到'A'。

    SELECT    A.A_id, A.col_2, col_3, B.col_2, A.col_4
              count(C.id) as C_count
    FROM      A
    JOIN      B ON (A.B_id = B.B_id)
    LEFT JOIN C ON (A.A_id = C.A_id)
    WHERE     A.A_id = ?
    GROUP BY  A.A_id, A.col_2, col_3, B.col_2, A.col_4
    ORDER BY  CASE WHEN A.col_2 = ?
                   THEN 0
                   ELSE 1 
              END, col_3;
    

    这似乎有点低效,因为我必须列出 GROUP BY 也因为我在计算我真正想要的是是否至少有一场比赛。这能改进吗?

    1 回复  |  直到 14 年前
        1
  •  13
  •   Charles Bretana    14 年前

     Select A.A_id, A.col_2, col_3, 
        B.col_2, A.col_4, 
        Case When Exists (Select * From C
                          Where A_id = A.A_id)
             Then 1 Else 0 End As C_Exists
     From A Join B 
         On (A.B_id = B.B_id) 
     Where A.A_id = ?    
     Order By Case When A.col_2 = ? 
               Then 0 Else 1 End, col_3;