奇怪的 Hibernate 生成的 SQL 带有 OVER() 函数和 ORDER BY ORDER ON
strange Hibernate-generated SQL with OVER() function and ORDER BY ORDER ON
我在遗留 Web 应用程序中遇到了轻微的排序异常问题,我想我应该从 Hibernate 使用 DB2Dialect 生成的后端 SQL 查询开始:
FROM (SELECT inner2_.*,
ROWNUMBER()
OVER(
ORDER BY ORDER OF inner2_) AS rownumber_
FROM (SELECT this_.sohn AS SOHN1_15_11_,
this_.aslc AS ASLC2_15_11_,
this_.cc AS CC3_15_11_,
bb1_.sbn AS SBN1_2_0_,
bb1_.abc AS ABC3_4_5_,
mh2_.smhn AS SMHN1_9_1_,
mh2_.sabc AS SABC3_4_6_,
og8_.sogn AS SOGN1_11_2_,
og8_.sogo AS SOGO3_4_7_,
oc9_.socn AS SOCN_1_13_3_,
oc9_.soco AS SOCO_3_4_8_
FROM ott.oh this_
INNER JOIN ott.bb1_
ON this_.sbn = bb1_.sbn
INNER JOIN ott.mh2_
ON this_.smhn = mh2_.smhn
LEFT OUTER JOIN ott.og og8_
ON this_.sogn = og8_.sogn
LEFT OUTER JOIN ott.oc oc9_
ON this_.socn = oc9_.socn
WHERE ( 1 = 1 )
AND bb1_.sbn = ?
AND mh2_.smhn = ?
FETCH first 200 ROWS only) AS inner2_) AS inner1_
WHERE rownumber_ > 190
ORDER BY rownumber_
这个查询有什么作用?我特别好奇 OVER()
,当我 google 这样的 SQL 函数时,它不会出现(但它是一个 MDX 函数?)。
此查询在应用程序中的作用是抓取分页列表的最后一页,该列表按甚至未出现在查询中的字段排序。初始加载时填充第一页的查询不同,其生成的 SQL 对所需字段进行 ORDER BY。
因此,为了解决这个问题,我需要了解查询的功能。接受者?
OVER() 是所谓的 OLAP 函数的一部分 - 可以在 DB2 SQL Cookbook 中找到一个很好的描述 - 即在这里可用:
http://www.ids-system.de/images/Downloads/DB2V97CK.PDF
一组非常实用的功能
还有很好的额外内容
http://www.ibm.com/developerworks/data/library/techarticle/dm-0401kuznetsov/
我在遗留 Web 应用程序中遇到了轻微的排序异常问题,我想我应该从 Hibernate 使用 DB2Dialect 生成的后端 SQL 查询开始:
FROM (SELECT inner2_.*,
ROWNUMBER()
OVER(
ORDER BY ORDER OF inner2_) AS rownumber_
FROM (SELECT this_.sohn AS SOHN1_15_11_,
this_.aslc AS ASLC2_15_11_,
this_.cc AS CC3_15_11_,
bb1_.sbn AS SBN1_2_0_,
bb1_.abc AS ABC3_4_5_,
mh2_.smhn AS SMHN1_9_1_,
mh2_.sabc AS SABC3_4_6_,
og8_.sogn AS SOGN1_11_2_,
og8_.sogo AS SOGO3_4_7_,
oc9_.socn AS SOCN_1_13_3_,
oc9_.soco AS SOCO_3_4_8_
FROM ott.oh this_
INNER JOIN ott.bb1_
ON this_.sbn = bb1_.sbn
INNER JOIN ott.mh2_
ON this_.smhn = mh2_.smhn
LEFT OUTER JOIN ott.og og8_
ON this_.sogn = og8_.sogn
LEFT OUTER JOIN ott.oc oc9_
ON this_.socn = oc9_.socn
WHERE ( 1 = 1 )
AND bb1_.sbn = ?
AND mh2_.smhn = ?
FETCH first 200 ROWS only) AS inner2_) AS inner1_
WHERE rownumber_ > 190
ORDER BY rownumber_
这个查询有什么作用?我特别好奇 OVER()
,当我 google 这样的 SQL 函数时,它不会出现(但它是一个 MDX 函数?)。
此查询在应用程序中的作用是抓取分页列表的最后一页,该列表按甚至未出现在查询中的字段排序。初始加载时填充第一页的查询不同,其生成的 SQL 对所需字段进行 ORDER BY。
因此,为了解决这个问题,我需要了解查询的功能。接受者?
OVER() 是所谓的 OLAP 函数的一部分 - 可以在 DB2 SQL Cookbook 中找到一个很好的描述 - 即在这里可用:
http://www.ids-system.de/images/Downloads/DB2V97CK.PDF
一组非常实用的功能
还有很好的额外内容
http://www.ibm.com/developerworks/data/library/techarticle/dm-0401kuznetsov/