连接不正常的max()函数-DB2 SQL
我有一个查询,在这个查询中,我试图查找某些字段中包含最大值的行。我尝试了max(field_name),但它返回了所有行连接不正常的max()函数-DB2 SQL,sql,db2-400,Sql,Db2 400,我有一个查询,在这个查询中,我试图查找某些字段中包含最大值的行。我尝试了max(field_name),但它返回了所有行 SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION FROM CUSTOMER_CMNT AS CMNT INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID LEFT JOIN CUSTOMER_L
SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
GROUP BY CMNT.VER_NBR, CMNT.SEQ_NBR, CMNT.ID, CMNT.CMNT_TXT
输出
+----------------+------+---------+
| CMNT.ID | SEQ | VERSION |
+----------------+------+---------+
133340000101373 2 1
133340000101374 2 1
133340000101373 3 1
133340000101374 3 1
133340000101373 4 1
133340000101374 4 1
133340000101373 1 2
133340000101374 1 2
133340000101373 1 3
133340000101374 1 3
133340000101373 2 3
133340000101374 2 3
但是,预期的行是(max(SEQ_NBR)):
但是,我修改了查询,如下所示,返回上述预期结果
SELECT CMNT.ID, MAX(CMNT.SEQ_NBR) AS SEQ, CMNT.VER_NBR AS VERSION
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124
CMNT.SEQ_NBR = (select max(CMNT.SEQ_NBR) from
FROM
CUSTOMER_CMNT AS CMNT
INNER JOIN CUSTOMER_PROD AS PRODUCT ON PRODUCT.PRODUCT_ID = CMNT.BALE_ID
LEFT JOIN CUSTOMER_LOAN LOAN ON (PRODUCT.LOAN_ID = LOAN.LOAN_ID) AND (PRODUCT.START_YR = LOAN.START_YR) AND (PRODUCT.ST_CD = LOAN.ST_CD) AND (PRODUCT.CNTY_CD = LOAN.CNTY_CD)
WHERE CMNT.ID > 0 AND PRODUCT.START_YR = 2013 AND LOAN.LOAN_NBR = 17124)
由于子查询的原因,此查询的时间更长。有没有办法缩短/改进此查询?这个怎么样?但不确定它是否表现得更好
declare @data table (cmnt_id bigint, seq int, version int)
insert into @data
values (133340000101373, 2, 1), (133340000101374, 2, 1), (133340000101373, 3, 1), (133340000101374, 3, 1), (133340000101373, 4, 1), (133340000101374, 4, 1), (133340000101373, 1, 2), (133340000101374, 1, 2), (133340000101373, 1, 3), (133340000101374, 1, 3), (133340000101373, 2, 3), (133340000101374, 2, 3)
select d.cmnt_id, d.seq, d.version
from @data d
inner join (
select cmnt_id, max(seq) as target_seq
from @data
group by cmnt_id
) x on x.cmnt_id = d.cmnt_id
and d.seq = x.target_seq
order by d.cmnt_id
理想情况下,通过VisualExplain工具冷运行查询,它将推荐它认为缺少的索引 除此之外,我绝对推荐以下索引/键:
CUSTOMER_CMNT
index1 => BALE_ID
index2 => ID, SEQ_NBR
CUSTOMER_PROD
index1 => START_YR
index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD
CUSTOMER_LOAN
index1 => LOAN_NBR
index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD
嗯 可能与连接无关。所述第一查询组以大于期望值的方式进行分组,以实现期望的聚合;如果删除了所有连接条件,只查询了CMNT文件,则会出现相同的结果。第二个查询在语法上不正确,即使标量子选择像AND谓词那样编码但正确,该查询也不可能产生正确的结果。似乎有可能,样本数据只是碰巧产生了预期的输出;实际上是偶然的,而不是故意的;由于缺少分组依据,子选择将选择最大值(SEQ_NBR),而不考虑其他任何内容。
CUSTOMER_CMNT
index1 => BALE_ID
index2 => ID, SEQ_NBR
CUSTOMER_PROD
index1 => START_YR
index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD
CUSTOMER_LOAN
index1 => LOAN_NBR
index2 => LOAN_ID, START_YR, ST_CD, CNTY_CD