嵌套计数查询的SQL语法问题?

时间:2014-12-23 21:55:49

标签: sql oracle

对于以下查询,我在Oracle SQL Developer中面临Missing expresssions错误, 有人可以帮我解决这个问题。

  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

2 个答案:

答案 0 :(得分:1)

子查询必须包装在括号中。一旦你添加它们,Oracle应该停止抱怨。

答案 1 :(得分: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>) ) . . . 。您可以通过执行以下操作获得相同的语义:

{{1}}

为此目的使用子查询是不常见的。我想知道你是否可以使用分析函数。