0

在 DB2 V9 Z/O 上

三行以下的查询。

SELECT J01_REGION, I20_MMS_NO, I20_CONSUMER_ID, I21_CONSUMER_ID, I21_CASE_ID,
I42_FIN_MGR_PROV, J01_PROVIDER, I21_CASE_OPEN_DT, I42_FM_BEG_DT
FROM SERDB.I20_CONSUMER_T INNER JOIN SERDB.I21_CONS_CASE_T ON I20_CONSUMER_ID = 
I21_CONSUMER_ID
INNER JOIN SERDB.I42_FIN_MGR_T ON I21_CASE_ID = I42_CASE_ID 
INNER JOIN SERDB.J01_PROVIDER_T ON I42_FIN_MGR_PROV = J01_PROVIDER
WHERE J01_REGION = 2
AND I20_CONSUMER_ID = 96603

我希望查询通过使用 I21_CASE_OPEN_DT 和 I42_FM_BEG_DT 的 MAX 值仅返回一行。如果我使用:

SELECT J01_REGION, I20_MMS_NO, I20_CONSUMER_ID, I21_CONSUMER_ID, I21_CASE_ID,  MAX 
(I21_CASE_OPEN_DT), MAX(I42_FM_BEG_DT), I42_FIN_MGR_PROV, J01_PROVIDER
FROM SERDB.I20_CONSUMER_T INNER JOIN SERDB.I21_CONS_CASE_T ON I20_CONSUMER_ID = 
I21_CONSUMER_ID 
INNER JOIN SERDB.I42_FIN_MGR_T ON I21_CASE_ID = I42_CASE_ID 
INNER JOIN SERDB.J01_PROVIDER_T ON I42_FIN_MGR_PROV = J01_PROVIDER
WHERE J01_REGION = 2
AND I20_CONSUMER_ID = 96603;

我收到: SQL0122N 没有 GROUP BY 子句的 SELECT 语句在 SELECT 子句中包含列名或表达式和列函数,或者列名或表达式包含在 SELECT 子句中但不包含在 GROUP BY 子句中。SQLSTATE=42803

如果我使用:

SELECT J01_REGION, I20_MMS_NO, I20_CONSUMER_ID, I21_CONSUMER_ID, I21_CASE_ID,
I42_FIN_MGR_PROV, J01_PROVIDER, I21_CASE_OPEN_DT, I42_FM_BEG_DT
FROM SERDB.I20_CONSUMER_T INNER JOIN SERDB.I21_CONS_CASE_T ON I20_CONSUMER_ID = 
I21_CONSUMER_ID 
INNER JOIN SERDB.I42_FIN_MGR_T ON I21_CASE_ID = I42_CASE_ID 
INNER JOIN SERDB.J01_PROVIDER_T ON I42_FIN_MGR_PROV =  J01_PROVIDER
WHERE J01_REGION = 2
AND I20_CONSUMER_ID = 96603
AND MAX(I21_CASE_OPEN_DT)
AND MAX(I42_FM_BEG_DT);

我收到:SQL0199N 在“AND”之后使用保留字“AND”无效。预期的令牌可能包括:“MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MINUTE HOURS”。SQLSTATE=42601

有人对我还能做什么有建议吗?

谢谢

4

1 回答 1

0

第二个错误告诉你所有你需要知道的:

没有 GROUP BY 子句的 SELECT 语句在 SELECT 子句中包含列名或表达式和列函数,或者列名或表达式包含在 SELECT 子句中但不包含在 GROUP BY 子句中

如果您使用聚合(MAXMIN等),您必须按 select 语句中的所有其他字段进行分组,您还没有这样做。

进行第二个查询,并添加 GROUP BY 子句让我们得到这个:

SELECT J01_REGION, I20_MMS_NO, I20_CONSUMER_ID, I21_CONSUMER_ID, I21_CASE_ID,  
    MAX (I21_CASE_OPEN_DT), MAX(I42_FM_BEG_DT), I42_FIN_MGR_PROV, J01_PROVIDER
FROM SERDB.I20_CONSUMER_T INNER JOIN SERDB.I21_CONS_CASE_T ON I20_CONSUMER_ID = 
I21_CONSUMER_ID 
INNER JOIN SERDB.I42_FIN_MGR_T ON I21_CASE_ID = I42_CASE_ID 
INNER JOIN SERDB.J01_PROVIDER_T ON I42_FIN_MGR_PROV = J01_PROVIDER
WHERE J01_REGION = 2
    AND I20_CONSUMER_ID = 96603
GROUP BY J01_REGION, I20_MMS_NO, I20_CONSUMER_ID, I21_CONSUMER_ID, I21_CASE_ID,
    I42_FIN_MGR_PROV, J01_PROVIDER;
于 2012-08-22T17:16:54.543 回答