错误: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 关键字