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

时间:2013-03-11 08:46:39

标签: sql group-by sybase-ase

我有这个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 个答案:

答案 0 :(得分:2)

由于您使用左连接列出了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。所说),您可能需要按ID和名称使用group来获得准确的结果。

GROUP BY j.client_id, c.name 
ORDER BY result DESC

答案 1 :(得分:2)

我认为您希望每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

答案 2 :(得分:1)

您正在使用Sybase扩展来处理GROUP BY的标准行为。来自the documentation(请参阅“Transact-SQL扩展到分组依旧”页面的中间位置):

  

标准SQL的Transact-SQL扩展通过允许引用未用于创建组或汇总计算的列和表达式,使显示数据更加灵活:

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

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

...

     

当Transact-SQL扩展向显示添加行和列时,或者如果省略group by,查询结果可能难以解释。

该页面的示例解释了会发生什么:

  

Transact-SQL扩展列,价格(在选择列表中,但不是聚合而不在group by子句中),导致所有限定行显示在每个限定组中,即使标准group by子句生成每组单行。 group by仍影响向量聚合,它计算每组每行显示的每组平均价格(它们与例如a计算的值相同)

请注意GROUP BY的标准行为不允许这样做,并且会产生“使用未在分组子句中指定的非聚合列”的错误。


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