使用选择和连接的复杂插入语句

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。我粘贴了完整的查询而没有更改不安全的信息。出于这个原因,我删除了查询。

以上是关于使用选择和连接的复杂插入语句的主要内容,如果未能解决你的问题,请参考以下文章

Swift SQLITE3 插入/选择问题

如何使用插入和选择语句

数据结构时间复杂度冒泡排序选择排序插入排序

使用 OLEDB 选择语句获取错误值

通过选择插入的 oracle 存储过程

最熟悉的几种排序——冒泡排序插入排序和选择排序