我有一个简单的查询:
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?
谢谢
答案 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)
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": [],