Sql 如何修复Oracle 11.2中两级以上子查询中的引用别名
我有一个两难的问题,即查询在Oracle 12.1中工作,而在Oracle 11.2中不工作。经过深入研究,在Oracle 11.2中,如果子查询太深,则无法在最外层的查询中引用别名 在下面的查询中,1和2都从各自的子查询引用LT,这些子查询是嵌套在更新中的两个或三个级别。这一限制显然已在第12条中删除,但在第11.2条中保留并发布 我不能使用WITH子句,因为这是一个更新。是否有其他解决方案可以让这个查询在11.2中工作Sql 如何修复Oracle 11.2中两级以上子查询中的引用别名,sql,oracle11g,reference,sql-update,subquery,Sql,Oracle11g,Reference,Sql Update,Subquery,我有一个两难的问题,即查询在Oracle 12.1中工作,而在Oracle 11.2中不工作。经过深入研究,在Oracle 11.2中,如果子查询太深,则无法在最外层的查询中引用别名 在下面的查询中,1和2都从各自的子查询引用LT,这些子查询是嵌套在更新中的两个或三个级别。这一限制显然已在第12条中删除,但在第11.2条中保留并发布 我不能使用WITH子句,因为这是一个更新。是否有其他解决方案可以让这个查询在11.2中工作 UPDATE TBL LT SET LT.DW = 'W' WHERE
UPDATE TBL LT
SET LT.DW = 'W'
WHERE (LT.CID, LT.ID) IN (
SELECT
A.CID,
A.ID
FROM (
SELECT DISTINCT
CID,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY
(CASE
WHEN ((SELECT F.NET_INC
FROM BUDGET F
WHERE F.TRACE_ID = LT.TRACE_ID ) -- (1)
< (SELECT LOINC
FROM MAL
WHERE CODE = (SELECT F.SIZEC
FROM BUDGET F
WHERE F.TRACE_ID = LT.TRACE_ID))) -- (2)
THEN 1
ELSE 2
END),
OC_DT ,
CID) AS "RANK",
ID,
G_ID
FROM TBL
WHERE RN = 120) A
WHERE
A.RANK = 1
AND A.RN = 'B'
AND LT.STS = 'V'
);
也许你可以试试合并 我试过了,但无法测试,因为我没有你的桌子。试试看,必要时修一下,难怪你非要修不可 顺便说一句,size似乎是一个无效的列名,所以我在它前面加了一个c
MERGE INTO tbl lt
USING (SELECT a.cid, a.id
FROM (
-- subquery where TRACE_ID isn't too deeply nested ...
SELECT DISTINCT
y.cid,
y.sts,
ROW_NUMBER ()
OVER (
PARTITION BY id
ORDER BY
CASE
WHEN ( (SELECT f.net_inc
FROM budget f
WHERE f.trace_id =
y.trace_id) <
(SELECT loinc
FROM mal
WHERE code =
(SELECT f.sizec
FROM budget f
WHERE f.trace_id =
y.trace_id)))
THEN
1
ELSE
2
END,
oc_dt,
cid)
AS rnk,
y.id,
y.g_id
FROM tbl y -- ... because you select from TBL in it
WHERE y.rn = 120) a
WHERE a.rnk = 1
AND a.rn = 'B'
AND a.sts = 'V') x
ON ( lt.cid = x.cid
AND lt.id = x.id)
WHEN MATCHED
THEN
UPDATE SET lt.dw = 'W';
或者,使用基于子查询的视图:
CREATE VIEW v_tbl
AS
SELECT DISTINCT
cid,
ROW_NUMBER ()
OVER (
PARTITION BY id
ORDER BY
(CASE
WHEN ( (SELECT f.net_inc
FROM budget f
WHERE f.trace_id = y.trace_id) -- (1)
<
(SELECT loinc
FROM mal
WHERE code = (SELECT f.csize
FROM budget f
WHERE f.trace_id = y.trace_id))) -- (2)
THEN
1
ELSE
2
END),
oc_dt,
cid)
AS rnk,
id,
g_id
FROM tbl y
WHERE rn = 120;
UPDATE tbl lt
SET lt.dw = 'W'
WHERE (lt.cid, lt.id) IN (SELECT v.cid, v.id
FROM v_tbl
WHERE v.rnk = 1
AND v.rn = 'B'
AND lt.sts = 'V');
我认为使用视图更直接。有一秒钟我想,因为它仍然使用两层深度的子查询,所以它会引起问题,但显然不会。它可以在Oracle 11.2和12.1中工作。谢谢