使用选择和连接的复杂插入语句
Posted
技术标签:
【中文标题】使用选择和连接的复杂插入语句【英文标题】:Complex insert statement using select and joins 【发布时间】:2015-02-03 16:44:32 【问题描述】:我想将值插入到 CAPTURED_DATA_01 表中。 CAPTURED_DATA_01 表中列的值来自 select 语句和 join。因此它有点复杂的 insert 语句。应该从正在运行的查询中添加 SUBSCRIPTION_ID:
Select * from(
select WF.SUBSCRIPTION_ID
from WF_WORKFLOW@FONIC_RETAIL WF,CAPTURED_DATA_01 CP
where WF.SUBSCRIPTION_ID > CP.SUBSCRIPTION_ID and
WF.SUBSCRIPTION_ID IN
(
select iw.SUBSCRIPTION_ID
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@FONIC_RETAIL
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='SELF_REGISTRATION'
)
and WF.NAME='INITIATE_MANDATE'
and WF.STATUS_ID=0 order by wf.START_DATE desc);
这是我尝试过的查询,但在我的子查询中得到错误 cannot use LOB locators selected from remote tables,A remote LOB column cannot be referenced,Remove references to LOBs in remote tables.
,我在其中转换了 SUBSCRIPTION_ID、Order_Number、Order_type
Insert into CAPTURED_DATA_01(SUBSCRIPTION_ID) VALUES
((select WF.SUBSCRIPTION_ID
from WF_WORKFLOW@FONIC_RETAIL WF,CAPTURED_DATA_01 CP
where WF.SUBSCRIPTION_ID > CP.SUBSCRIPTION_ID and
WF.SUBSCRIPTION_ID IN
(
select iw.SUBSCRIPTION_ID
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@FONIC_RETAIL
where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'
) iw
where iw.order_type='SELF_REGISTRATION'
)and WF.NAME='INITIATE_MANDATE'
and WF.STATUS_ID=0))
【问题讨论】:
你能发布整个错误吗?错误详细信息可能会更好地说明其失败的原因。此外,您可能会发现创建 sql fiddle 可能有助于展示您所得到的与您想要的。 我收到错误,因为无法使用从远程表中选择的 LOB 定位器,无法引用远程 LOB 列,删除对远程表中 LOB 的引用。在我的子查询中,我已经转换了 SUBSCRIPTION_ID,Order_Number,Order_type 【参考方案1】:您不能在子查询表达式中选择多个列,而且您也没有选择足够的值。您不需要添加额外级别的子查询,您需要以下内容:
Insert into CAPTURED_DATA_01(EVENT_ID,SUBSCRIPTION_ID,EVENT_TIMESTAMP,
ENV_ID,BRAND_ID,BP_ID)
Select '10006',SUBSCRIPTION_ID,START_DATE,
ENV_ID,BRAND_ID,BP_ID -- where are these coming from? should they be literals too?
from(
select WF.SUBSCRIPTION_ID,WF.START_DATE
from WF_WORKFLOW@FONIC_RETAIL WF,CAPTURED_DATA_01 CP
...
目前尚不清楚ENV_ID,BRAND_ID,BP_ID
值的来源,但您可能也打算将这些值设为文字值;您说它们“应该使用 select join 添加”,但是对于什么以及如何适应,并不明显。
【讨论】:
我现在再次进行了一点编辑,删除了其他内容以使其变得简单。现在首先我想只将 SUBSCRIPTION_ID 插入到 CAPTURED_DATA_01 表中,但得到相同的错误。请检查问题。我用来获取 SUBSCRIPTION_ID 的查询和昨天一样。 @Andrew - 为什么您从问答中删除了查询?没有它们,它们没有多大意义。如果您发布了您不应该发布的代码,您是否可以至少显示一个简化/匿名版本的问题,以便将来对其他人仍然有用? 我现在已经编辑了问题 alex。我粘贴了完整的查询而没有更改不安全的信息。出于这个原因,我删除了查询。以上是关于使用选择和连接的复杂插入语句的主要内容,如果未能解决你的问题,请参考以下文章