Connect By Prior 与之前的值
Connect By Prior with previous values
对不起,我试图找到答案,但没有找到。我会在我的查询中有太前的 (!) ARNT as parentARTNR
和 POSNR as parentPOSNR
。我试过 CONNECT_BY_ROOT
,但这只是 TOP ARTNR
和 POSNR
。比我试过SYS_CONNECT_BY_PATH(t1.ARTNR, '/') as parentARTNR
,但是那个returns全树。
你知道我该怎么做吗?
这个 SQL 工作正常,但它没有父值。
SELECT
level,
t1.ARTNR,
t1.POSNR
FROM
SMSTLPOS t1
START WITH
t1.ARTNR = '057516'
CONNECT BY t1.ARTNR = PRIOR t1.KOMPARTNR
我想要的是:
SELECT
level,
t1.ARTNR,
t1.POSNR,
t0.ARTNR as parentARTNR,
t0.POSNR as parentPOSNR
FROM
SMSTLPOS t1
START WITH
t1.ARTNR = '057516'
CONNECT BY t1.ARTNR = PRIOR t1.KOMPARTNR
或者例如用更新声明变量值...我不知道。
这与我想在 sql 服务器中为 Oracle 执行的操作相同:
with
n(KOMPARTNR, ARTIKEL_NR, level, parentARTNR, parentPOSNR) as (
select SMSTLPOS.KOMPARTNR,
SMSTLPOS.ARTNR,
1 as level,
SMSTLPOS.ARTNR as parentARTNR,
SMSTLPOS.POSNR as parentPOSNR
from SMSTLPOS
WHERE SMSTLPOS.ARTNR='51269' -- ARTNR isn't constant
UNION ALL
SELECT SMSTLPOS1.KOMPARTNR,
SMSTLPOS1.ARTNR,
n.level + 1,
n.parentARTNR,
n.parentPOSNR
from SMSTLPOS as SMSTLPOS1, n
WHERE n.KOMPARTNR = SMSTLPOS1.ARTNR
)
SELECT * from n
天哪,我做到了! :D 全部在 SYS_CONNECT_BY_PATH 中,但格式为 /10/20/30/40,我想要(从这个例子)30。首先我使用 substr 并获得 /10/20/30,然后我发现'/' 的位置并在前一个 substr 上再次使用 substr。这很好还是你有更好的主意?
SELECT
level,
SMSTLPOS.ARTNR,
SMSTLPOS.POSNR,
SUBSTR((SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'), '/',-1)-1))), (INSTR(SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'), '/',-1)-1)), '/', -1))+1) as parentPOSNR,
SUBSTR((SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'), '/',-1)-1))), (INSTR(SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'), '/',-1)-1)), '/', -1))+1) as parentARTNR
FROM
SMSTLPOS
START WITH
SMSTLPOS.ARTNR = '057516'
CONNECT BY SMSTLPOS.ARTNR = PRIOR SMSTLPOS.KOMPARTNR
对不起,我试图找到答案,但没有找到。我会在我的查询中有太前的 (!) ARNT as parentARTNR
和 POSNR as parentPOSNR
。我试过 CONNECT_BY_ROOT
,但这只是 TOP ARTNR
和 POSNR
。比我试过SYS_CONNECT_BY_PATH(t1.ARTNR, '/') as parentARTNR
,但是那个returns全树。
你知道我该怎么做吗?
这个 SQL 工作正常,但它没有父值。
SELECT
level,
t1.ARTNR,
t1.POSNR
FROM
SMSTLPOS t1
START WITH
t1.ARTNR = '057516'
CONNECT BY t1.ARTNR = PRIOR t1.KOMPARTNR
我想要的是:
SELECT
level,
t1.ARTNR,
t1.POSNR,
t0.ARTNR as parentARTNR,
t0.POSNR as parentPOSNR
FROM
SMSTLPOS t1
START WITH
t1.ARTNR = '057516'
CONNECT BY t1.ARTNR = PRIOR t1.KOMPARTNR
或者例如用更新声明变量值...我不知道。
这与我想在 sql 服务器中为 Oracle 执行的操作相同:
with
n(KOMPARTNR, ARTIKEL_NR, level, parentARTNR, parentPOSNR) as (
select SMSTLPOS.KOMPARTNR,
SMSTLPOS.ARTNR,
1 as level,
SMSTLPOS.ARTNR as parentARTNR,
SMSTLPOS.POSNR as parentPOSNR
from SMSTLPOS
WHERE SMSTLPOS.ARTNR='51269' -- ARTNR isn't constant
UNION ALL
SELECT SMSTLPOS1.KOMPARTNR,
SMSTLPOS1.ARTNR,
n.level + 1,
n.parentARTNR,
n.parentPOSNR
from SMSTLPOS as SMSTLPOS1, n
WHERE n.KOMPARTNR = SMSTLPOS1.ARTNR
)
SELECT * from n
天哪,我做到了! :D 全部在 SYS_CONNECT_BY_PATH 中,但格式为 /10/20/30/40,我想要(从这个例子)30。首先我使用 substr 并获得 /10/20/30,然后我发现'/' 的位置并在前一个 substr 上再次使用 substr。这很好还是你有更好的主意?
SELECT
level,
SMSTLPOS.ARTNR,
SMSTLPOS.POSNR,
SUBSTR((SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'), '/',-1)-1))), (INSTR(SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.POSNR, '/'), '/',-1)-1)), '/', -1))+1) as parentPOSNR,
SUBSTR((SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'), '/',-1)-1))), (INSTR(SUBSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'),0, (INSTR(SYS_CONNECT_BY_PATH(SMSTLPOS.ARTNR, '/'), '/',-1)-1)), '/', -1))+1) as parentARTNR
FROM
SMSTLPOS
START WITH
SMSTLPOS.ARTNR = '057516'
CONNECT BY SMSTLPOS.ARTNR = PRIOR SMSTLPOS.KOMPARTNR