【发布时间】:2020-07-19 13:25:20
【问题描述】:
我有两个存储过程,它们过滤表上的记录并给出结果。以下是存储过程。
SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID
, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from APP_FTTX.span@SAT sp
INNER JOIN APP_FTTX.transmedia@SAT tm -- transmedia added
on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
AND LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%')
OR sp.RJ_SPAN_ID LIKE ('%SPQ%')
OR sp.RJ_SPAN_ID LIKE ('%SPR%')
OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU')
OR sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\'
OR sp.RJ_INTRACITY_LINK_ID IS NULL);
上面的SP返回4条记录,这些是我想要插入到表中的有效记录。
现在下面还有另一个 SP,它返回 7 条记录。
SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID
, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from APP_FTTX.span@SAT sp
-- INNER JOIN APP_FTTX.transmedia@SAT tm -- transmedia added
-- on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
-- WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
-- and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
-- and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
WHERE LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%')
OR sp.RJ_SPAN_ID LIKE ('%SPQ%')
OR sp.RJ_SPAN_ID LIKE ('%SPR%')
OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU')
OR sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\'
OR sp.RJ_INTRACITY_LINK_ID IS NULL);
SP 是相似的。第二个 SP 中有 3 条记录无效。所以我想要的是:我想将其他 3 条无效记录插入到另一个表中。
请建议如何实现。
更新
根据 Alex 的评论,我在下面的代码中实现了减号部分。
SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from APP_FTTX.span@SAT sp
-- INNER JOIN APP_FTTX.transmedia@SAT tm -- transmedia added
-- on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
-- WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
-- and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
-- and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
WHERE LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR sp.RJ_SPAN_ID LIKE ('%SPQ%') OR sp.RJ_SPAN_ID LIKE ('%SPR%')
OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR sp.RJ_INTRACITY_LINK_ID IS NULL)
MINUS
SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID,
TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from APP_FTTX.span@SAT sp
INNER JOIN APP_FTTX.transmedia@SAT tm --
transmedia added
on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
WHERE length(sp.RJ_SPAN_ID) =
length(tm.RJ_SPAN_ID)
and sp.RJ_MAINTENANCE_ZONE_CODE =
tm.RJ_MAINTENANCE_ZONE_CODE
and sp.INVENTORY_STATUS_CODE =
tm.INVENTORY_STATUS_CODE
AND LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR
sp.RJ_SPAN_ID LIKE ('%SPQ%') OR sp.RJ_SPAN_ID LIKE ('%SPR%')
OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR
sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE =
'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE
('%\_9%') ESCAPE '\' OR sp.RJ_INTRACITY_LINK_ID IS NULL);
【问题讨论】:
-
您没有显示任何存储过程,只是查询。我不太确定你在问什么 - 你可能只是在寻找
minus? -
@AlexPoole:是的,我正在寻找要插入到各自表中的记录,如上所述。你有什么想法吗?而上面的查询我会把它转换成程序
-
如果存储过程与您实际发布的代码无关,也许不提?
-
您可以编写一个新查询来修改谓词,使其仅返回这三个记录;或者您可以减去两个现有查询以了解它们之间的区别 - 请参阅我之前链接到的文档。无论哪种方式,然后将其用作
insert ... select。 -
作为一个侧面观察,我注意到所有表引用都指向一个 db 链接 - 同一个 db 链接。这似乎很奇怪。我更希望其中一张桌子是远程的,但不是所有桌子。为什么不在 SAT 数据库中运行查询呢?你在那里做的事情可能有正当的理由,但我对使用数据库链接有误解。
标签: oracle join stored-procedures inner-join insert-update