代码之家  ›  专栏  ›  技术社区  ›  Iyas

尝试离开联接时出现意外结果

  •  1
  • Iyas  · 技术社区  · 12 年前

    我有一个运行良好的SQL语句。。

    SELECT result=count(j.client_id), j.client_id 
    FROM spp_job j  
    GROUP BY j.client_id 
    ORDER BY  count(j.client_id) DESC
    

    但在使用LEFT JOIN时失败

    SELECT result=count(j.client_id), c.name 
    FROM spp_job j 
    LEFT JOIN spp_client c ON j.client_id = c.id  
    GROUP BY j.client_id 
    ORDER BY count(j.client_id) DESC
    

    我不知道出了什么问题。我想显示客户端名称,而不是它们的id。第二个SQL给了我所有的客户端记录。

    3 回复  |  直到 12 年前
        1
  •  2
  •   Kaf    12 年前

    由于您将c.name与左侧联接一起列出,因此需要 Group By c.name instead j.client_id

    SELECT result=count(j.client_id), c.name 
    FROM spp_job j LEFT JOIN
        spp_client c ON j.client_id = c.id  
    GROUP BY c.name 
    ORDER BY result DESC
    

    更新: 由于名称不是唯一的(正如@lc.所说),您可能需要使用group-by-by-id和name来获得准确的结果。

    GROUP BY j.client_id, c.name 
    ORDER BY result DESC
    
        2
  •  2
  •   John Woo    12 年前

    我想你想得到 NAME client_id .

    您还需要添加 name GROUP BY 子句,因为该列不是 聚集的 ,

    SELECT  result = count(j.client_id), 
            c.name 
    FROM    spp_job j 
            LEFT JOIN spp_client c 
                ON j.client_id = c.id  
    GROUP   BY j.client_id, c.name
    ORDER   BY result DESC
    
        3
  •  1
  •   Community CDub    7 年前

    您正在运行Sybase扩展,以实现 GROUP BY 从…起 the documentation (请参阅页面下半部分的“分组依据和拥有的Transact-SQL扩展”):

    标准SQL的Transact-SQL扩展允许引用不用于创建组或摘要计算的列和表达式,从而使显示数据更加灵活:

    • 包含聚合的选择列表可以包含扩展列,这些扩展列不是聚合函数的参数,也不包含在groupby子句中。扩展列会影响最终结果的显示,因为会显示其他行。

      • group-by子句可以包括不在选择列表中的列或表达式。

    ...

    当Transact-SQL扩展将行和列添加到显示中时,或者如果省略了分组依据,则查询结果可能很难解释。

    该页面中的示例解释了发生的情况:

    Transact-SQL扩展列price(在选择列表中,但不是聚合,也不在逐组子句中)会导致所有符合条件的行显示在每个符合条件的组中,即使标准的逐组子句为每个组生成一行。分组依据仍然影响向量聚合,向量聚合计算每组每行显示的每组平均价格(它们与例如a计算的值相同)

    请注意 分组依据 不允许这样做,并将产生一个错误,大意是“使用未在group-by子句中指定的非聚合列”。


    对于您的查询,您还应该按分组 c.name as JW. suggests .