2012-08-09 73 views
1

我有以下查詢,它工作的很棒!使用ORDER BY和UNION的ORACLE查詢

的唯一的事情是我需要的結果DESC順序設置和下面的ORDER BY子句,我已經添加到我的查詢結束時產生以下Oracle錯誤:

ORA-00933:SQL命令未正確地結束 00933. 00000 - 「SQL命令不能正確地結束」 *原因:
*動作: 行錯誤:46列:54

這裏查詢。再次,這個查詢工作。這只是當我添加以下行:

FINAL_SEARCH order by FINAL_SEARCH.DOC_HDR_ID desc 

一切都打破。

任何想法? 我相信我的ALIAS與它有關,但我可能是錯的。

查詢 -

Select * from (select DISTINCT(DOC_HDR.DOC_HDR_ID), 
    DOC_HDR.INITR_PRNCPL_ID, 
    DOC_HDR.DOC_HDR_STAT_CD, 
    DOC_HDR.CRTE_DT, 
    DOC_HDR.TTL, 
    DOC_HDR.APP_DOC_STAT, 
    DOC1.DOC_TYP_NM, 
    DOC1.LBL, DOC1.DOC_HDLR_URL, 
    DOC1.ACTV_IND 
    from KREW_DOC_TYP_T DOC1, KREW_DOC_HDR_T DOC_HDR 
    where DOC_HDR.INITR_PRNCPL_ID IN ('10000000001') and 
     (DOC1.DOC_TYP_NM = 'PO' or 
      DOC1.DOC_TYP_NM = 'POA' or 
      DOC1.DOC_TYP_NM = 'POC' or 
      DOC1.DOC_TYP_NM= 'POPH' or 
      DOC1.DOC_TYP_NM ='PORH' or 
      DOC1.DOC_TYP_NM = 'POR' or 
      DOC1.DOC_TYP_NM = 'PORT' or 
      DOC1.DOC_TYP_NM = 'POSP' or 
      DOC1.DOC_TYP_NM = 'POV') and 
      DOC_HDR.DOC_HDR_STAT_CD!= 'I' and 
      DOC_HDR.DOC_TYP_ID = DOC1.DOC_TYP_ID) 

    UNION 

    Select DISTINCT DOC_HDR.DOC_HDR_ID, 
      DOC_HDR.INITR_PRNCPL_ID, 
      DOC_HDR.DOC_HDR_STAT_CD, 
      DOC_HDR.CRTE_DT, 
      DOC_HDR.TTL, 
      DOC_HDR.APP_DOC_STAT, 
      DOC1.DOC_TYP_NM, 
      DOC1.LBL, 
      DOC1.DOC_HDLR_URL, 
      DOC1.ACTV_IND 
    FROM KREW_DOC_TYP_T DOC1, 
    KREW_DOC_HDR_T DOC_HDR 
    WHERE DOC1.DOC_TYP_NM = 'PO' AND CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = ANY ( 
     Select PPT.FDOC_NBR 
     FROM PUR_PO_T PPT, PL_PURCHASE_LOG_PO_T PPL 
     WHERE PPT.AP_PUR_DOC_LNK_ID = ANY ( 
     Select PRT.AP_PUR_DOC_LNK_ID 
     FROM PUR_REQS_T PRT, 
       KREW_DOC_HDR_T DOC_HDR 
     WHERE CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = PRT.FDOC_NBR AND 
      DOC_HDR.INITR_PRNCPL_ID IN ('10000000001'))) FINAL_SEARCH order by FINAL_SEARCH.DOC_HDR_ID desc; 

更新 - 我刪除別名並放置在「ORDER BY」聲明這兩個查詢後,它在SQL開發工作;但是,當我通過使用Java生成此查詢的Web應用程序執行此查詢時,我收到有關無效符號的ORACLE錯誤。 無效符號是用於終止第一個ORDER BY語句的分號。在SQL Developer中它不會起作用,但顯然當我執行通過Web應用程序生成的相同語句時 - 它失敗了。

+0

它與Web應用程序的工作沒有分號? – 2012-08-09 18:18:37

+0

如果我刪除分號,則會得到以下錯誤:收到的錯誤嘗試執行搜索:DataAccessException:ConnectionCallback;錯誤的SQL語法[];嵌套異常是java.sql.SQLException:ORA-00933:SQL命令未正確結束 – 2012-08-09 18:21:50

+0

您沒有用適當的()包裝代碼。答案在下面:) – EplusL 2012-08-09 18:28:05

回答

2

你需要計算你的括號 - 兩個聯合查詢應該在一個括號 - 然後你的別名和SELECT * FROM將工作。

SELECT * 
    FROM ((SELECT DISTINCT (doc_hdr.doc_hdr_id), 
          doc_hdr.initr_prncpl_id, 
          doc_hdr.doc_hdr_stat_cd, 
          doc_hdr.crte_dt, 
          doc_hdr.ttl, 
          doc_hdr.app_doc_stat, 
          doc1.doc_typ_nm, 
          doc1.lbl, 
          doc1.doc_hdlr_url, 
          doc1.actv_ind 
       FROM krew_doc_typ_t doc1, krew_doc_hdr_t doc_hdr 
      WHERE doc_hdr.initr_prncpl_id IN ('10000000001') 
       AND (doc1.doc_typ_nm = 'PO' 
       OR doc1.doc_typ_nm = 'POA' 
       OR doc1.doc_typ_nm = 'POC' 
       OR doc1.doc_typ_nm = 'POPH' 
       OR doc1.doc_typ_nm = 'PORH' 
       OR doc1.doc_typ_nm = 'POR' 
       OR doc1.doc_typ_nm = 'PORT' 
       OR doc1.doc_typ_nm = 'POSP' 
       OR doc1.doc_typ_nm = 'POV') 
       AND doc_hdr.doc_hdr_stat_cd != 'I' 
       AND doc_hdr.doc_typ_id = doc1.doc_typ_id) 
      UNION 
      SELECT DISTINCT doc_hdr.doc_hdr_id, 
          doc_hdr.initr_prncpl_id, 
          doc_hdr.doc_hdr_stat_cd, 
          doc_hdr.crte_dt, 
          doc_hdr.ttl, 
          doc_hdr.app_doc_stat, 
          doc1.doc_typ_nm, 
          doc1.lbl, 
          doc1.doc_hdlr_url, 
          doc1.actv_ind 
      FROM krew_doc_typ_t doc1, krew_doc_hdr_t doc_hdr 
      WHERE doc1.doc_typ_nm = 'PO' 
      AND CAST (doc_hdr.doc_hdr_id AS VARCHAR (14)) = 
        ANY (SELECT ppt.fdoc_nbr 
          FROM pur_po_t ppt, pl_purchase_log_po_t ppl 
          WHERE ppt.ap_pur_doc_lnk_id = 
            ANY (SELECT prt.ap_pur_doc_lnk_id 
              FROM pur_reqs_t prt, 
               krew_doc_hdr_t doc_hdr 
              WHERE CAST (
                doc_hdr.doc_hdr_id AS VARCHAR (14) 
               ) = prt.fdoc_nbr 
              AND doc_hdr.initr_prncpl_id IN 
                 ('10000000001')))) 
     final_search 
ORDER BY final_search.doc_hdr_id DESC; 
+0

謝謝John D!這是出色的工作! – 2012-08-09 18:31:31

+0

@John:非常整潔的調試 – Victor 2012-08-09 18:45:07

1

我認爲你正在使用一個額外的支架「)」

Select * from (select DISTINCT(DOC_HDR.DOC_HDR_ID), 
    DOC_HDR.INITR_PRNCPL_ID, 
    DOC_HDR.DOC_HDR_STAT_CD, 
    DOC_HDR.CRTE_DT, 
    DOC_HDR.TTL, 
    DOC_HDR.APP_DOC_STAT, 
    DOC1.DOC_TYP_NM, 
    DOC1.LBL, DOC1.DOC_HDLR_URL, 
    DOC1.ACTV_IND 
    from KREW_DOC_TYP_T DOC1, KREW_DOC_HDR_T DOC_HDR 
    where DOC_HDR.INITR_PRNCPL_ID IN ('10000000001') and 
     (DOC1.DOC_TYP_NM = 'PO' or 
      DOC1.DOC_TYP_NM = 'POA' or 
      DOC1.DOC_TYP_NM = 'POC' or 
      DOC1.DOC_TYP_NM= 'POPH' or 
      DOC1.DOC_TYP_NM ='PORH' or 
      DOC1.DOC_TYP_NM = 'POR' or 
      DOC1.DOC_TYP_NM = 'PORT' or 
      DOC1.DOC_TYP_NM = 'POSP' or 
      DOC1.DOC_TYP_NM = 'POV') and 
      DOC_HDR.DOC_HDR_STAT_CD!= 'I' and 
      DOC_HDR.DOC_TYP_ID = DOC1.DOC_TYP_ID 

    UNION 

    Select DISTINCT DOC_HDR.DOC_HDR_ID, 
      DOC_HDR.INITR_PRNCPL_ID, 
      DOC_HDR.DOC_HDR_STAT_CD, 
      DOC_HDR.CRTE_DT, 
      DOC_HDR.TTL, 
      DOC_HDR.APP_DOC_STAT, 
      DOC1.DOC_TYP_NM, 
      DOC1.LBL, 
      DOC1.DOC_HDLR_URL, 
      DOC1.ACTV_IND 
    FROM KREW_DOC_TYP_T DOC1, 
    KREW_DOC_HDR_T DOC_HDR 
    WHERE DOC1.DOC_TYP_NM = 'PO' AND CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = ANY ( 
     Select PPT.FDOC_NBR 
     FROM PUR_PO_T PPT, PL_PURCHASE_LOG_PO_T PPL 
     WHERE PPT.AP_PUR_DOC_LNK_ID = ANY ( 
     Select PRT.AP_PUR_DOC_LNK_ID 
     FROM PUR_REQS_T PRT, 
       KREW_DOC_HDR_T DOC_HDR 
     WHERE CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = PRT.FDOC_NBR AND 
      DOC_HDR.INITR_PRNCPL_ID IN ('10000000001')))) FINAL_SEARCH order by FINAL_SEARCH.DOC_HDR_ID desc; 

先刪除最後一個支架形式,其中的條件,並嘗試。 此外,在年底增加一個支架) FINAL_SEARCH order by

1

你忘了一些括號:

Select * from (select DISTINCT(DOC_HDR.DOC_HDR_ID), 
    DOC_HDR.INITR_PRNCPL_ID, 
    DOC_HDR.DOC_HDR_STAT_CD, 
    DOC_HDR.CRTE_DT, 
    DOC_HDR.TTL, 
    DOC_HDR.APP_DOC_STAT, 
    DOC1.DOC_TYP_NM, 
    DOC1.LBL, DOC1.DOC_HDLR_URL, 
    DOC1.ACTV_IND 
    from KREW_DOC_TYP_T DOC1, KREW_DOC_HDR_T DOC_HDR 
    where DOC_HDR.INITR_PRNCPL_ID IN ('10000000001') and 
     (DOC1.DOC_TYP_NM = 'PO' or 
      DOC1.DOC_TYP_NM = 'POA' or 
      DOC1.DOC_TYP_NM = 'POC' or 
      DOC1.DOC_TYP_NM= 'POPH' or 
      DOC1.DOC_TYP_NM ='PORH' or 
      DOC1.DOC_TYP_NM = 'POR' or 
      DOC1.DOC_TYP_NM = 'PORT' or 
      DOC1.DOC_TYP_NM = 'POSP' or 
      DOC1.DOC_TYP_NM = 'POV') and 
      DOC_HDR.DOC_HDR_STAT_CD!= 'I' and 
      DOC_HDR.DOC_TYP_ID = DOC1.DOC_TYP_ID) 

    UNION 

    (Select DISTINCT DOC_HDR.DOC_HDR_ID, 
      DOC_HDR.INITR_PRNCPL_ID, 
      DOC_HDR.DOC_HDR_STAT_CD, 
      DOC_HDR.CRTE_DT, 
      DOC_HDR.TTL, 
      DOC_HDR.APP_DOC_STAT, 
      DOC1.DOC_TYP_NM, 
      DOC1.LBL, 
      DOC1.DOC_HDLR_URL, 
      DOC1.ACTV_IND 
    FROM KREW_DOC_TYP_T DOC1, 
    KREW_DOC_HDR_T DOC_HDR 
    WHERE DOC1.DOC_TYP_NM = 'PO' AND CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = ANY ( 
     Select PPT.FDOC_NBR 
     FROM PUR_PO_T PPT, PL_PURCHASE_LOG_PO_T PPL 
     WHERE PPT.AP_PUR_DOC_LNK_ID = ANY ( 
     Select PRT.AP_PUR_DOC_LNK_ID 
     FROM PUR_REQS_T PRT, 
       KREW_DOC_HDR_T DOC_HDR 
     WHERE CAST(DOC_HDR.DOC_HDR_ID AS VARCHAR(14)) = PRT.FDOC_NBR AND 
      DOC_HDR.INITR_PRNCPL_ID IN ('10000000001')))) FINAL_SEARCH order by FINAL_SEARCH.DOC_HDR_ID desc; 
0

刪除 「;」 Web應用程序中用於填充數據集/數據表的符號。

您也可以通過塊才能使用列順序作爲別名,如:

選擇..... 排序按1級遞增,4遞減