select a.userid, max(decode(sign(a.value-c.value), 1, a.value, c.value))
from A, B, C
where A.userid = b.user_id
  and b.groupid = c.groupid
group by a.userid

解决方案 »

  1.   

    select UserID, MAX(Value) as Value
        from 
            (select A.UserID, MAX(C.GroupValue) as Value
                from A inner join B on A.UserID=B.UserID
                       inner join C on B.GroupID=C.GroupID
                group by A.UserID
             union
             select A.UserID, MAX(A.Value) as Value
                from A inner join B on A.UserID=B.UserID) as D
        group by UserID
          
          
      

  2.   

    上面写错, 应如下:select UserID, MAX(Value) as Value
        from 
            (select A.UserID, MAX(C.GroupValue) as Value
                from A inner join B on A.UserID=B.UserID
                       inner join C on B.GroupID=C.GroupID
                group by A.UserID         union
     
             select A.UserID, MAX(A.Value) as Value
                from A 
                group by A.UserID
            ) as D
        group by UserID
      

  3.   

    TO: nononono(null,null)兄, 很高兴经常遇见你.
    哈哈,这次我抢先了
      

  4.   

    或如下:select UserID, MAX(Value) as Value
        from 
            (select A.UserID, 
                    MAX( case when C.GroupValue>A.Value 
                           then C.GroupValue 
                           else A.Value) as Value
                from A inner join B on A.UserID=B.UserID
                      inner join C on B.GroupID=C.GroupID
                group by A.UserID
             ) as D
        group by UserID
      

  5.   

    TO: KingSunSha, 呵呵我后面又写的不好, 应该如下吧:select A.UserID as UserID, 
           MAX( case when C.GroupValue>A.Value then C.GroupValue else A.Value) as Value
       from A inner join B on A.UserID=B.UserID
              inner join C on B.GroupID=C.GroupID
       group by A.UserID
            
      

  6.   

    select UserID,max(Value) MaxValue from
    (select A.UserID,max(C.Value) Value
    from A,B,C 
    where A.UserID = B.UserID and B.GroupID = C.GroupID 
    group by A.UserID union
    select UserID,Value from A) tt
    group by UserID
      

  7.   

    我比较反感用UNION, 不到万不得已我是不会用的. 因为速度太慢了.
    如果是ORACLE PL/SQL的话, 还可以用LEAST函数:
    select a.userid, -(LEAST(-a.value,-c.value))
    ...如果是SQL SERVER, 那nononono(null,null)的最后一句效率最高
      

  8.   

    SQL中4no兄的最後一種非常不錯,
    不過少了一個end.
      

  9.   

    真的是又错啦!!
    ...
        MAX( case when C.GroupValue>A.Value then C.GroupValue else A.Value end ) as Value
    ...  
      

  10.   

    不好意思,还有一个问题,我的三个表都有一个ModuleID字段,然后有个
    Modules表
    ModuleID ModuleName
    我要列举每个ModuleID的UserID和Value值
      

  11.   

    select A.ModuleID, D.ModuleName, A.UserID, MAX( case when C.GroupValue>A.Value then C.GroupValue else A.Value End) as Value
      from A inner join B on (A.UserID=B.UserID and A.ModuleID=B.ModuleID)
              inner join C (on B.GroupID=C.GroupID And B.ModuleID=C.ModuleID)
               inner join Module AS D on A.ModulID = D.ModuleID
      group by A.ModuleID, D.ModuleName, A.UserID依样画葫芦,哈哈!