2015-01-29 2 views
0

결과를 얻으려면 선택 쿼리에서이 문 결과를 ALIAS로 사용하려는 2 SELECT 문이 있습니다. 하지만 내 쿼리의 마지막 줄에 ORA-00933: SQL command not properly ended으로 오류가 나타납니다. 나는 내가 무엇을 놓치고 있는지 모른다. 여기 내 쿼리입니다 :SQL ALIAS select 문에서 작동하지 않습니다

Select(SELECT xt.id 
FROM SOAP_MONITORING sm 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147" 
    ), 
    'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions 
     return $i/ax2130:id' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "ID" number path '/')) AS xt, 
    (SELECT xx.id 
FROM SOAP_MONITORING sm 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://webshop.data.soap.CDRator.com/xsd' as "ns7" 
    ), 
    'for $i in //ns7:orderType return $i' 
    passing XMLType(sm.REQUEST_XML) 
    columns "ID" VARCHAR2(30) path '/')) AS xx 
    FROM SOAP_MONITORING 
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' and xx.id = 'NEW' ; 
+0

첫 번째 질문 : 당신은 확인 모두 한 당신 서브 쿼리는 메인 쿼리와 독립적으로 작동합니까? –

+0

네, 내 SQL 쿼리와 그 잘 작동하는지 확인했습니다. 그냥 내가이 선택 쿼리 결과를 ALIAS로 사용하고 내 선택 진술에 사용하십시오. 이 두 선택 결과는 단일 테이블에 속하기 때문에. 그리고 나는 같은 테이블을 쿼리하려고합니다. –

답변

0

당신은 같은 passing 대상에서 두위한 XMLTable 절을 가질 수, 하위 쿼리 작업을 수행 할 필요가 없습니다 : 이전 질문에서 샘플 XML을 사용하고

SELECT xt_res.id 
FROM SOAP_MONITORING sm 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147" 
    ), 
    'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions 
     return $i/ax2130:id' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "ID" number path '/') xt_res 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://webshop.data.soap.CDRator.com/xsd' as "ns7" 
    ), 
    'for $i in //ns7:orderType return $i' 
    passing XMLType(sm.REQUEST_XML) 
    columns "ORDER_TYPE" VARCHAR2(30) path '/') xt_req 
where sm.WEB_SERVICE_NAME='RatorWebShopService' 
and sm.WEB_METHOD_NAME='placeShopOrder' 
and xt_req.order_type = 'NEW' ; 


        ID 
--------------------- 
    201501070917439804 
    201501070917439804 

, 롤백 편집의 요청을 포함, 모두 ... 유효한 것으로 정리


논의를 바탕으로을 그 이 일치하는 ID에 대해, 당신이 join 사용할 수 있습니다 (3210), 당신의 wf_workflow 테이블에서 데이터를 얻을 수 있습니다 :

SELECT wf.* from 
SOAP_MONITORING sm 
CROSS JOIN XMLTable(XMLNAMESPACES ( 
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147" 
), 
'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions 
return $i/ax2130:id' 
passing XMLType(sm.RESPONSE_XML) 
columns "ID" number path '/') xt_res 
CROSS JOIN XMLTable(XMLNAMESPACES ( 
     'http://webshop.data.soap.CDRator.com/xsd' as "ns7" 
), 
'for $i in //ns7:orderType return $i' 
passing XMLType(sm.REQUEST_XML) 
columns "ORDER_TYPE" VARCHAR2(30) path '/') xt_req 
JOIN WF_WORKFLOW wf 
on wf.SUBSCRIPTION_ID = xt_res.id 
where sm.WEB_SERVICE_NAME='RatorWebShopService' 
and sm.WEB_METHOD_NAME='placeShopOrder' 
and xt_req.order_type = 'NEW' 
and WF.NAME='INITIATE_MANDATE' 
and WF.STATUS_ID=0; 

을하거나 in 절과 이전 쿼리를 포함한다; 쉽게 이해할 수 있지만, (당신이하지 것이라고 말했다 중복을 억제 제외) 기능적으로 동일하고, join 버전으로 다른 성능을 가지고 있습니다 적용될 수 있습니다

SELECT wf.* 
from WF_WORKFLOW wf 
where wf.SUBSCRIPTION_ID in ( 
    select xt_res.id 
    from SOAP_MONITORING sm 
    CROSS JOIN XMLTable(XMLNAMESPACES ( 
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147" 
), 
    'for $i in /soapenv:Envelope/soapenv:Body/ns:placeShopOrderResponse/ns:return/ax2147:subscriptions 
    return $i/ax2130:id' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "ID" number path '/') xt_res 
    CROSS JOIN XMLTable(XMLNAMESPACES ( 
     'http://webshop.data.soap.CDRator.com/xsd' as "ns7" 
), 
    'for $i in //ns7:orderType return $i' 
    passing XMLType(sm.REQUEST_XML) 
    columns "ORDER_TYPE" VARCHAR2(30) path '/') xt_req 
    where sm.WEB_SERVICE_NAME='RatorWebShopService' 
    and sm.WEB_METHOD_NAME='placeShopOrder' 
    and xt_req.order_type = 'NEW' 
) 
and WF.NAME='INITIATE_MANDATE' 
and WF.STATUS_ID=0; 
+0

Alex 대단히 감사합니다. 그 일하는 벌금 :). 이제이 ID를 사용하고 다른 테이블과 조인하여 결과를 얻으려면 작은 질문 만하십시오. 우리는 어떻게 할 수 있습니까? 나는 단순히 xt_req를 가져와이 결과를 다른 테이블과 조인 할 필요가 있습니까? –

+0

이전 질문에서 다루지 않았습니까? 예,'where' 절 앞에 또 하나의 조인을 추가하면됩니다. 조건은'xt_res.id'를 기반으로합니다. (방금 별칭을 수정하고 요청 열 이름을 'order_type'으로 변경하여 혼란을 피했습니다. –

+0

대단히 감사합니다. Alex :) 내 인생을 구 했어요. 오늘이 문제를 해결하기 위해 하루를 보냈습니다. –

관련 문제