당신은 같은 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;
는
첫 번째 질문 : 당신은 확인 모두 한 당신 서브 쿼리는 메인 쿼리와 독립적으로 작동합니까? –
네, 내 SQL 쿼리와 그 잘 작동하는지 확인했습니다. 그냥 내가이 선택 쿼리 결과를 ALIAS로 사용하고 내 선택 진술에 사용하십시오. 이 두 선택 결과는 단일 테이블에 속하기 때문에. 그리고 나는 같은 테이블을 쿼리하려고합니다. –