按一个表中的所有列分组

时间:2018-05-16 18:45:18

标签: sql join group-by db2

我有一个简单的查询:

select c.* , max(TLO.BILL_DATE)
from

client c
left outer join TLORDER TLO
on TLO.CUSTOMER = c.CLIENT_ID
OR TLO.ORIGIN = c.CLIENT_ID
OR TLO.DESTINATION = c.CLIENT_ID

GROUP BY c.*

查询本身非常简单,但是客户端表包含200多个字段,我需要全部检索它们。

有没有办法做类似

的事情
GROUP BY c.*

还是我必须输入所有200+ GROUP_BY?

谢谢

4 个答案:

答案 0 :(得分:1)

不,您不必全部输入,因为您不需要使用group by。相反,使用相关子查询:

select c.* ,
       (select max(TLO.BILL_DATE)
        from TLORDER TLO
        where TLO.CUSTOMER = c.CLIENT_ID or
              TLO.ORIGIN = c.CLIENT_ID or
              TLO.DESTINATION = c.CLIENT_ID
       )
from client c;

如果您使用group by,那么您必须列出所有列。请注意,在这种情况下,ANSI SQL仅支持使用主键或唯一键。因此,这将符合ANSI标准:

select c.*, max(TLO.BILL_DATE)
from client c left join
     TLORDER TLO
     on TLO.CUSTOMER = c.CLIENT_ID or
        TLO.ORIGIN = c.CLIENT_ID or
        TLO.DESTINATION = c.CLIENT_ID
group by c.c_id;

我不相信DB2支持这种构造,尽管其他一些数据库也可以。

答案 1 :(得分:0)

SQL中不允许

GROUP BY c.*

您可能需要考虑编写一个可以返回所有字段的子查询,例如:https://dba.stackexchange.com/questions/21226/why-do-wildcards-in-group-by-statements-not-work

答案 2 :(得分:0)

你就是这样做的。

select c.* ,
    LAST_VALUE(TLO.BILL_DATE)
    OVER (PARTITION BY C.CLIENT_ID 
          ORDER BY TLO.BILL_DATE ASC 
          RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LAST_BILL
from client c
left join TLORDER TLO on TLO.CUSTOMER = c.CLIENT_ID
                      OR TLO.ORIGIN = c.CLIENT_ID
                      OR TLO.DESTINATION = c.CLIENT_ID

答案 3 :(得分:-1)

我会像这样编写SQL。它不像相关的子选择那么简洁,但它在你想要做的事情上更明确..它可能比相关的子选择更好

"api_key": [],