错误:ORA-00923:未找到FROM关键字

时间:2015-07-08 13:55:26

标签: sql oracle

我尝试使用记录计数从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关键字

我该如何解决这个问题。

提前致谢!

3 个答案:

答案 0 :(得分:2)

我猜您应该从第一行的*中删除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

答案 1 :(得分:0)

您在select语句中使用了aggreagte函数。因此,您无法简单地为其他列调用Select *

  1. 首先,您应为为easy eas选择的内部列提供别名。
  2. 然后选择外部SELECT
  3. 中的列
  4. 由于select中的一列使用了agg功能,因此Group By应该由Select中的其他列完成。
  5. 这里为了方便我给列名称为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 
    

答案 2 :(得分:0)

我没有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;

在过滤行之前,它使用分析查询来获取整个表中所有brand_id的计数。我不确定你是否想要每个brand_id(count(*) over (partititon by brand_id)或者不同brand_ids(count(distinct brand_id) over ())的计数,所以你必须使用count函数来获取你得到的结果。