2014-12-23 48 views
0

对于以下查询,我正面临Oracle SQL Developer中的Missing expresssions错误, 有人可以帮我解决这个问题。对于count的嵌套计数查询的SQL语法问题?

SELECT COUNT(DISTINCT SEC.ERROR_GROUP_ID), 
    COUNT(DISTINCT SEC_DET.ERROR_GROUP_ID), 
    COUNT(DISTINCT MB.ERROR_GROUP_ID), 
    COUNT(DISTINCT OD.ERROR_GROUP_ID), 
    SELECT COUNT(DISTINCT SEC_SCH.ERROR_GROUP_ID) 
    FROM SCHEMA.SECURITY SEC 
    LEFT OUTER JOIN SCHEMA.SECURITY_SCHEDULE SEC_SCH 
    ON SEC.MSD_SECURITY_ID  =SEC_SCH.MSD_SECURITY_ID 
    WHERE SEC.MSD_SECURITY_ID IN 
     (SELECT DISTINCT main.MSD_SECURITY_ID 
     FROM SCHEMA2.Positions main 
      WHERE main.QUANTITY != 0 
      AND systimestamp >= main.eff_from_dt 
      AND main.eff_to_dt > systimestamp 
      AND systimestamp >= main.asrt_from_dt 
      AND main.asrt_to_dt > systimestamp 
    ) 

FROM SCHEMA.SECURITY SEC 
JOIN SCHEMA.SECURITY_DETAIL SEC_DET 
ON SEC.MSD_SECURITY_ID = SEC_DET.MSD_SECURITY_ID 
LEFT OUTER JOIN SCHEMA.MUNI_BOND MB 
ON SEC.MSD_SECURITY_ID=MB.MSD_SECURITY_ID 
LEFT OUTER JOIN SCHEMA.OPTION_DETAIL OD 
ON SEC.MSD_SECURITY_ID =OD.MSD_SECURITY_ID 
WHERE SEC.MSD_SECURITY_ID IN 
    (SELECT DISTINCT main.MSD_SECURITY_ID 
    FROM SCHEMA2.Positions main 
    WHERE main.QUANTITY != 0 
    AND systimestamp >= main.eff_from_dt 
    AND main.eff_to_dt > systimestamp 
    AND systimestamp >= main.asrt_from_dt 
    AND main.asrt_to_dt > systimestamp 
) ; 

错误

ORA-00936:缺少表达 00936. 00000 - “失踪表达” *原因:
*动作: 行错误:365列:3

+0

我已经更新上面的查询使用圆括号螺母现在我得到这个错误 ORA-00937:不是单组分组函数 00937. 00000 - “不是一个单一群组功能” *原因: *行动: 错误在线:365列:11 –

回答

1

子查询必须用括号括起来。一旦你添加它们,Oracle应该停止抱怨。

0

子查询确实需要放在括号内。只是用COUNT(DISTINCT)而非嵌套子查询的子查询也许可以写成:

SELECT COUNT(DISTINCT SEC.ERROR_GROUP_ID), 
     COUNT(DISTINCT SEC_DET.ERROR_GROUP_ID), 
     COUNT(DISTINCT MB.ERROR_GROUP_ID), 
     COUNT(DISTINCT OD.ERROR_GROUP_ID), 
     (SELECT COUNT(DISTINCT SEC_SCH.ERROR_GROUP_ID) 
     FROM SCHEMA.SECURITY SEC LEFT OUTER JOIN 
      SCHEMA.SECURITY_SCHEDULE SEC_SCH 
      ON SEC.MSD_SECURITY_ID = SEC_SCH.MSD_SECURITY_ID 
     WHERE SEC.MSD_SECURITY_ID IN (<values>) 
     ) . . . 

注意这从您的查询一个非常小的语义差别。这不包括NULL的值,而你的版本。您可以通过执行获得相同的语义:

 (SELECT COUNT(DISTINCT SEC_SCH.ERROR_GROUP_ID) + MAX(CASE WHEN SEC_SCH.ERROR_GROUP_ID IS NULL THEN 1 ELSE 0 END) 
     FROM SCHEMA.SECURITY SEC LEFT OUTER JOIN 
      SCHEMA.SECURITY_SCHEDULE SEC_SCH 
      ON SEC.MSD_SECURITY_ID = SEC_SCH.MSD_SECURITY_ID 
     WHERE SEC.MSD_SECURITY_ID IN (<values>) 
     ) . . . 

这是不寻常的使用子查询为此而定。我想知道是否可以使用分析函数。

+0

我仍然收到一个错误,不幸的是,我不能粘贴在评论中的查询,因为它太大所以我添加一个答案,而不是专家来看。 –