【问题标题】:In SQL "WITH AS" clause is not working. is there any alternative way?在 SQL 中,\"WITH AS\" 子句不起作用。还有其他方法吗?
【发布时间】:2022-11-24 20:34:21
【问题描述】:

我有一个查询,是这样的:

    select col1,col2 from (
       with RESULTSET as (
       select * from t1 where rank_val=1 
      )  
      select  T1.col1, T1.col2    
      FROM RESULTSET T1, t88a, t88b
      where T1.col1=T88a.col1 and T88a.col2 = T1.col2
     AND T1.col2=T88b.col2 and T88b.col1 <> T1.col1
   ) where NOT (c1 IS NULL AND c2 IS NULL)   ORDER BY col1, col2;

我有一个要求,我需要使用一个外部With As,如下所示:

WITH NEW AS(select col1,col2 from (
       with RESULTSET as (
       select * from t1 where rank_val=1 
      )  
      select  T1.col1, T1.col2    
      FROM RESULTSET T1, t88a, t88b
      where T1.col1=T88a.col1 and T88a.col2 = T1.col2
     AND T1.col2=T88b.col2 and T88b.col1 <> T1.col1
   ) where NOT (c1 IS NULL AND c2 IS NULL)   ORDER BY col1, col2)
   SELECT * FROM NEW;

它给了我例外:

 ORA-32034: unsupported use of WITH clause
 32034. 00000 -  "unsupported use of WITH clause"

如何通过删除内部 With As 来重新编写查询。

【问题讨论】:

  • 你不能嵌套我认为的那些,但你可以在单个 with 子句中包含多个:with ALIAS1 as (Query1), ALIAS2 as (Query2), ALIAS3 as (Query3) select ....。每个查询都可以使用先前定义的别名。
  • @jarlh 其 Oracle Database 19c 企业版 Release 19.0.0.0.0
  • 为了帮助您找到它们的文档,这些子句称为“公用表表达式”,通常缩写为“CTE”。

标签: sql oracle


【解决方案1】:

将所有子查询移出,放入 CTE。是这样的:

WITH
   resultset
   AS
      (SELECT *
         FROM t1
        WHERE rank_val = 1),
   temp
   AS
      (SELECT t1.col1, t1.col2
         FROM resultset t1
              JOIN t88a ON t88a.col1 = t1.col1
              JOIN t88b
                 ON     t88b.col2 = t1.col2
                    AND t88b.col1 <> t1.col1),
   new
   AS
      (SELECT col1, col2
         FROM temp
        WHERE NOT (    col1 IS NULL
                   AND col2 IS NULL))
  SELECT *
    FROM new
ORDER BY col1, col2;

【讨论】:

    【解决方案2】:

    您可以将 WITH 定义为单独的部分或子查询的一部分。样本:

    WITH
        tbl_1 AS    -- CTE 1
            (
                Select 'A' "LTTR", 1 "NMBR" From Dual Union ALL
                Select 'B' "LTTR", 2 "NMBR" From Dual Union ALL
                Select 'C' "LTTR", 3 "NMBR" From Dual 
            ),
        tbl_2 AS    -- CTE 2
            (
                Select 'A' "LTTR", 10 "NMBR" From Dual Union ALL
                Select 'B' "LTTR", 20 "NMBR" From Dual Union ALL
                Select 'C' "LTTR", 30 "NMBR" From Dual 
            )
    Select
        t1.LTTR "LTTR", (t1.NMBR * t2.NMBR) - x.NMBR "CALCULATION"
    From
        tbl_1 t1
    Inner Join
        tbl_2 t2 ON(t2.LTTR = t1.LTTR)
    Inner Join
        (WITH
            tbl_x AS    -- CTE 3
            (
                Select 'A' "LTTR",  5 "NMBR" From Dual Union ALL
                Select 'B' "LTTR", 10 "NMBR" From Dual Union ALL
                Select 'C' "LTTR", 15 "NMBR" From Dual 
            )
            Select * From tbl_x
        ) x ON(x.LTTR = t1.LTTR)
    Order By 
        t1.LTTR
        
    /*  R e s u l t :
    LTTR CALCULATION
    ---- -----------
    A              5 
    B             30 
    C             75
    */
        
    

    虽然最好将它们放在一起 - 以后更容易管理它们...... 问候...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-07
      • 2016-03-25
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      相关资源
      最近更新 更多