2015-02-05 95 views
2

我有我想要導致SUBSCRIPTION_ID,ORDER_NUMBER查詢。查詢工作正常。但我也想現在顯示START_DATE SUBSCRIPTION_ID創建時。但我之後得到一個錯誤,這是:即使列存在ORA-00904無效標識符

ORA-00904: "WF"."START_DATE": invalid identifier 
00904. 00000 - "%s: invalid identifier" 

這裏是我的查詢:

select iw.SUBSCRIPTION_ID,iw.ORDER_NUMBER,WF.START_DATE 
    from (
     SELECT TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
     '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>',''),'</ax2130:id>','')) 
     AS SUBSCRIPTION_ID , 
     CAST(REPLACE(REPLACE(
     REGEXP_SUBSTR(REQUEST_XML,'<ns7:orderType>.+</ns7:orderType>'),'<ns7:orderType>',''),'</ns7:orderType>','') 
     AS VARCHAR(100)) AS order_type,TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML,'<ax2147:orderNumber>\d+</ax2147:orderNumber>'),'<ax2147:orderNumber>',''),'</ax2147:orderNumber>','')) 
     AS ORDER_NUMBER, 
     CREATE_DATE 
     FROM 
     SOAP_MONITORING,WF_WORKFLOW ww 
     where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
    ) iw 
    where iw.order_type='NEW' and iw.SUBSCRIPTION_ID IN 
    (select WF.SUBSCRIPTION_ID 
     from WF_WORKFLOW WF where WF.NAME='SIGNUP_MOBILE_PRE_PAID' 
    and WF.STATUS_ID=0 and WF.START_DATE < sysdate - 30/(24 * 60)) 

回答

2

的問題是,WF_WORKFLOW僅是提供用於IN謂詞子查詢的範圍和你在這個範圍之外引用它。

我認爲你可以重寫查詢,使用聯接,而不是像這樣:

select iw.SUBSCRIPTION_ID,iw.ORDER_NUMBER,WF.START_DATE 
from (
     SELECT TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
     '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>',''),'</ax2130:id>','')) 
     AS SUBSCRIPTION_ID , 
     CAST(REPLACE(REPLACE(
     REGEXP_SUBSTR(REQUEST_XML,'<ns7:orderType>.+</ns7:orderType>'),'<ns7:orderType>',''),'</ns7:orderType>','') 
     AS VARCHAR(100)) AS order_type,TO_NUMBER(REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML,'<ax2147:orderNumber>\d+</ax2147:orderNumber>'),'<ax2147:orderNumber>',''),'</ax2147:orderNumber>','')) 
     AS ORDER_NUMBER, 
     CREATE_DATE 
     FROM 
     SOAP_MONITORING,WF_WORKFLOW ww 
     where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
    ) iw 
inner join WF_WORKFLOW WF on iw.SUBSCRIPTION_ID = WF.SUBSCRIPTION_ID 
where iw.order_type='NEW' 
and WF.NAME='SIGNUP_MOBILE_PRE_PAID' 
and WF.STATUS_ID=0 and (WF.START_DATE < sysdate - 30/(24 * 60)) 

很顯然,我還沒有測試它...

+0

你好查詢運行,但現在WF.START_DATE沒有表現出從過去的30分鐘內正確的時間,我想。它也顯示了上個月的結果。 – Andrew 2015-02-05 13:23:27

+0

@Rahul我不清楚你是否想要超過30分鐘的記錄,或者如果你想在最近30分鐘內記錄。如果是後者,查詢結束時的條件應該是'(WF.START_DATE> = sysdate - 30 /(24 * 60))'? – jpw 2015-02-05 13:36:30

+0

哦,我很抱歉,這是正確的。我想超過30分鐘,並提供正確的結果。謝謝你:) – Andrew 2015-02-05 13:42:00

1

表WF不存在FROM子句中。你不能在這個表上選擇。

可能是你想要的東西是這樣的:

FROM (...) iw 
INNER JOIN WF_WORKFLOW WF on WF.SUBSCRIPTION_ID=iw.SUBSCRIPTION_ID 
WHERE iw.order_type='NEW' AND WF.NAME='SIGNUP_MOBILE_PRE_PAID' 
AND WF.STATUS_ID=0 and WF.START_DATE < sysdate - 30/(24 * 60)