Sql 如何修复Oracle 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

我有一个两难的问题,即查询在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 (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中工作。谢谢