错误:ORA-00923:在预期的地方找不到 FROM 关键字

Posted

技术标签:

【中文标题】错误:ORA-00923:在预期的地方找不到 FROM 关键字【英文标题】:ERROR: ORA-00923: FROM keyword not found where expected 【发布时间】:2015-07-08 13:55:25 【问题描述】:

我尝试使用记录数从 oracle sql 表中获取数据。我试过如下,

SELECT  *,
        (COUNT(BRAND_ID) AS TOTAL) 
FROM    
(
    SELECT  BRAND_ID, 
            BRAND_CODE,      
            BRAND_TITLE 
    FROM    BRAND 
    WHERE   ACTIVE = '1' 
    ORDER BY BRAND_TITLE ASC 
    OFFSET 10 ROWS 
    FETCH NEXT 10 ROWS ONLY 
) BRAND 
LEFT JOIN 
((
    SELECT  PRODUCT_ID, 
            PRODUCT_SKU_ID, 
            PRODUCT_WEB_ID, 
            PRODUCT_TITLE, 
            PRODUCT_SALES_PRICE, 
            PRODUCT_REGULAR_PRICE, 
            PRODUCT_RATING 
    FROM    PRODUCT 
    WHERE   
    (
        PRODUCT_TYPE='B' 
    OR  PRODUCT_TYPE='R' 
    ) 
    AND AVAILABILITY='1' 
)  PRDUCT ) ON BRAND.BRAND_CODE= PRDUCT.BRAND_CODE

执行此操作时出现以下错误,

错误:ORA-00923:未在预期的位置找到 FROM 关键字

我该如何解决这个问题。

提前致谢!

【问题讨论】:

尝试将 (COUNT(BRAND_ID) AS TOTAL) 替换为 COUNT(BRAND_ID) AS TOTAL 我还是得到了错误。 指定表格。而不是*use brand.*, PRDUCT.*, 然后我得到了ERROR: ORA-00937: not a single-group group function。我试过brand.*, PRDUCT.*。这工作正常。但是当我使用 COUNT(BRAND_ID) AS TOTAL 时,它不起作用 【参考方案1】:

我猜你应该从第一行的select statement 中删除*。试试下面的。

SELECT  (COUNT(BRAND_ID) AS TOTAL) 
FROM    
(
    SELECT  BRAND_ID, 
            BRAND_CODE,      
            BRAND_TITLE 
    FROM    BRAND 
    WHERE   ACTIVE = '1' 
    ORDER BY BRAND_TITLE ASC 
    OFFSET 10 ROWS 
    FETCH NEXT 10 ROWS ONLY 
) BRAND 
LEFT JOIN 
((
    SELECT  PRODUCT_ID, 
            PRODUCT_SKU_ID, 
            PRODUCT_WEB_ID, 
            PRODUCT_TITLE, 
            PRODUCT_SALES_PRICE, 
            PRODUCT_REGULAR_PRICE, 
            PRODUCT_RATING 
    FROM    PRODUCT 
    WHERE   
    (
        PRODUCT_TYPE='B' 
    OR  PRODUCT_TYPE='R' 
    ) 
    AND AVAILABILITY='1' 
)  PRDUCT ) ON BRAND.BRAND_CODE= PRDUCT.BRAND_CODE

【讨论】:

好的,那么你需要select 所需的列和group by 那些列。你不能简单地选择* 和一个聚合函数。【参考方案2】:

您在 select 语句中使用了一个 aggreagte 函数。所以你不能简单地为其他列调用Select *

    首先,您应该为选择的内部列提供一个别名。 然后选择外部 SELECT 中的列 由于 select 中的一列正在使用 agg 函数,因此 Group By 应该由 Select 中的其他列完成。

为了方便起见,我将列名命名为 c2,c3....重命名为您想要的。 如果没有给出别名,您可以指定指定的列。

 SELECT c2,c3,c4,c5,c6,c7,c8,c9,c10,
            COUNT(BRAND_ID) AS TOTAL 
    FROM    
    (
        SELECT  BRAND_ID ,
                BRAND_CODE AS c2,      
                BRAND_TITLE AS c3
        FROM    BRAND 
        WHERE   ACTIVE = '1' 
        ORDER BY BRAND_TITLE ASC 
        OFFSET 10 ROWS 
        FETCH NEXT 10 ROWS ONLY 
    ) BRAND 
    LEFT JOIN 
    ((
        SELECT  PRODUCT_ID AS c4, 
                PRODUCT_SKU_ID AS c5, 
                PRODUCT_WEB_ID AS c6, 
                PRODUCT_TITLE AS c7, 
                PRODUCT_SALES_PRICE AS c8, 
                PRODUCT_REGULAR_PRICE AS c9, 
                PRODUCT_RATING  AS c10
        FROM    PRODUCT 
        WHERE   
        (
            PRODUCT_TYPE='B' 
        OR  PRODUCT_TYPE='R' 
        ) 
        AND AVAILABILITY='1' 
    )  PRDUCT ) ON BRAND.BRAND_CODE= PRDUCT.BRAND_CODE
    Group By c2,c3,c4,c5,c6,c7,c8,c9,c10 

【讨论】:

这对我有用。但我这里只有 10 行。我需要获取BRAND 表中所有记录的总数。 @codebot 查询中的 BRAND 表限制为 10 行..删除它并尝试 这意味着如果我需要获取记录数,我应该删除 10 行限制。有没有其他方法可以在一个查询中做到这一点? @Codebot 你的要求是什么?如果您需要查找所有记录的计数,您不能限制行数。 我将创建一个包含表中记录总数的 JSON,并获得有限的记录。【参考方案3】:

我没有 12c,所以无法测试,但也许这就是你想要的?

SELECT  *
FROM    
(
    SELECT  BRAND_ID, 
            BRAND_CODE,      
            BRAND_TITLE 
    FROM    (select b.*,
                    count(brand_id) over () total
             from   BRAND b
    WHERE   ACTIVE = '1' 
    ORDER BY BRAND_TITLE ASC 
    OFFSET 10 ROWS 
    FETCH NEXT 10 ROWS ONLY 
) BRAND 
LEFT JOIN 
((
    SELECT  PRODUCT_ID, 
            PRODUCT_SKU_ID, 
            PRODUCT_WEB_ID, 
            PRODUCT_TITLE, 
            PRODUCT_SALES_PRICE, 
            PRODUCT_REGULAR_PRICE, 
            PRODUCT_RATING 
    FROM    PRODUCT 
    WHERE   
    (
        PRODUCT_TYPE='B' 
    OR  PRODUCT_TYPE='R' 
    ) 
    AND AVAILABILITY='1' 
)  PRDUCT ) ON BRAND.BRAND_CODE= PRDUCT.BRAND_CODE;

在过滤行之前,这会使用分析查询来获取整个表中所有品牌 ID 的计数。不过,我不确定您是否想要每个品牌 ID 的计数(count(*) over (partititon by brand_id) 或者可能是不同品牌 ID 的计数(count(distinct brand_id) over ()),所以您必须使用计数功能来获得您想要的结果之后。

【讨论】:

以上是关于错误:ORA-00923:在预期的地方找不到 FROM 关键字的主要内容,如果未能解决你的问题,请参考以下文章

错误:ORA-00923:在预期的地方找不到 FROM 关键字

ORA-00923: 使用 shell 脚本在预期的地方找不到 FROM 关键字

在 Oracle SQL 中使用 CTE(ORA-00923:在预期的地方找不到 FROM 关键字)

从关键字定义,但我仍然得到错误

oracle sql listagg [重复]

ORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字