这个 DB2 SQL 查询有啥问题?

Posted

技术标签:

【中文标题】这个 DB2 SQL 查询有啥问题?【英文标题】:What's wrong with this DB2 SQL Query?这个 DB2 SQL 查询有什么问题? 【发布时间】:2011-04-12 03:07:18 【问题描述】:
SELECT
    getOrgName(BC.ManageOrgID),
    COUNT(CASE WHEN (EXISTS (SELECT FO.OBJECTNO FROM FLOW_OBJECT FO WHERE FO.ObjectNo=CR.SerialNo) AND NVL(CR.FinallyResult,'') IN ('01','02','03','04','05')) THEN BC.ManageOrgID ELSE NULL END) 
FROM
    BUSINESS_CONTRACT BC,
    CLASSIFY_RECORD CR
WHERE
 CR.ObjectType='BusinessContract'
AND CR.ObjectNo=BC.SerialNo
GROUP BY BC.ManageOrgID, CR.SerialNo, CR.FinallyResult

我收到的错误信息是:

11:01:32 [SELECT - 0 行,0.000 秒] [错误代码:-112,SQL 状态:42607] DB2 SQL 错误:SQLCODE=-112,SQLSTATE=42607,SQLERRMC=SYSIBM.COUNT , 驱动程序=3.57.82 ... 1 条语句执行,0 行受影响,执行/获取时间:0.000/0.000 秒 [0 成功,0 警告,1 错误]

【问题讨论】:

【参考方案1】:

“列函数名称的操作数(在您的情况下为 count)包括列函数、标量全查询或子查询。” DB2 不允许这样做。有关更多信息,请参阅SQL112 上的文档。

我不太确定如何修复您的查询,但也许您可以在 GROUP BY 之后尝试 HAVING 子句。

【讨论】:

【参考方案2】:

这是重新处理查询的一种方法:

SELECT
getOrgName( BC.ManageOrgID ),
COUNT( FO.ObjectNo ) AS objectcount
FROM BUSINESS_CONTRACT BC
INNER JOIN CLASSIFY_RECORD CR
    ON CR.ObjectNo = BC.SerialNo
    AND CR.ObjectType = 'BusinessContract'
    AND CR.FinallyResult IN ( '01','02','03','04','05' )
INNER JOIN FLOW_OBJECT FO
    ON FO.ObjectNo = CR.SerialNo
GROUP BY BC.ManageOrgID
;

【讨论】:

以上是关于这个 DB2 SQL 查询有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

DB2与SQL有啥不同

这个 SQL 查询有啥问题[重复]

由于计数,db2/sql 查询不允许从连接中选择静态值

db2 怎样查一个sql连接执行过的所有语句?

有啥办法可以缩短这个 SQL 查询

在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询