2014-12-23 116 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

我仍然收到一個錯誤,不幸的是,我不能粘貼在評論中的查詢,因爲它太大所以我添加一個答案,而不是專家來看。 –