Oracle 作为聚合函数MIN()的结果引用后,列名无效
上面的查询从表Oracle 作为聚合函数MIN()的结果引用后,列名无效,oracle,aggregate-functions,min,ora-00904,Oracle,Aggregate Functions,Min,Ora 00904,上面的查询从表CUST\u DETAILS中选择所有列,其中最早的值位于CREATION\u TIMESTAMP列中 知道为什么MIN\u TIMESTAMP会遇到无效标识符吗 以下是应显示的列: SELECT cust_detl.*, MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS MIN_TIMESTAMP FROM CUST_DETAILS cust_detl WHERE CREATION_TIMESTAMP=M
CUST\u DETAILS
中选择所有列,其中最早的值位于CREATION\u TIMESTAMP
列中
知道为什么MIN\u TIMESTAMP
会遇到无效标识符吗
以下是应显示的列:
SELECT cust_detl.*,
MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS MIN_TIMESTAMP
FROM CUST_DETAILS cust_detl
WHERE CREATION_TIMESTAMP=MIN_TIMESTAMP;
我还需要选择CREATION\u TIMESTAMP
列,只有那些具有最小时间戳的列才会被选择。问题是不允许使用nextval
的序列。我需要查询中的序列,因为此语句将用于以后的INSERT
SELECT…INSERT INTO
PK需要增加 列名无效,首先使用where条件过滤数据,然后在过滤的数据上使用select语句。在使用它之前,需要将其放入子查询中
SELECT
CUSTOMER_DTL_SEQ.nextval,
CUST_ID
CUS_REF_ID
CUST_NAME
CUST_ADDRESS
CREATION_TIMESTAMP
FROM
(
CUSTOMER_DTL_SEQ.nextval,
cust_detl.CUST_ID,
cust_detl.CUST_REF_ID,
cust_detl.CUST_NAME,
cust_detl.CUST_ADDRESS,
cust_detl.CREATION_TIMESTAMP,
MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS min_timestamp
FROM cust_details cust_detl
)
WHERE CREATION_TIMESTAMP = min_timestamp;
更新:我不知道您的表中有哪些列,但如果您只需要特定列,则查询如下(假设您只需要选择列表中的cust_id、column1、column2和column3列)
如果仍然没有得到解决方案,post将显示表中的列列表和预期输出
Update2:在外部查询中获取光标,此查询应该可以正常工作
SELECT cust_id,
column1,
column2,
column3
FROM (SELECT cust_detl.cust_id,
cust_detl.column1,
cust_detl.column2,
cust_detl.column3,
cust_detl.creation_timestamp,
MIN(creation_timestamp) over(PARTITION BY cust_id) AS min_timestamp
FROM cust_details cust_detl)
WHERE creation_timestamp = min_timestamp;
我尝试使用
cust_detl.
,它返回多条记录,但其中一条记录的时间戳为min。如果没有它,CREATION\u TIMESTAMP
列将无效。我是否可以修复只选择了某些列而不是选择所有列的问题?@user2102665:我在这里为您提供了解决方案。但是你没有注意。您必须在内部选择列表中添加列名,以便在子查询外部可见。您的select中缺少它,您没有向我们显示它。@San,添加了受尊重的列和预期结果。这几乎是的重复项-如果OP的焦点在工作查询上,则应将其作为重复项关闭;但是,如果OP的重点是为什么查询不起作用,那么答案应该集中在这个问题上,这不是重复。
SELECT cust_id,
column1,
column2,
column3
FROM (SELECT cust_detl.cust_id,
cust_detl.column1,
cust_detl.column2,
cust_detl.column3,
cust_detl.creation_timestamp,
MIN(creation_timestamp) over(PARTITION BY cust_id) AS min_timestamp
FROM cust_details cust_detl)
WHERE creation_timestamp = min_timestamp;
SELECT customer_dtl_seq.nextval,
cust_id,
cus_ref_id,
cust_name,
cust_address,
creation_timestamp
FROM (SELECT cust_detl.cust_id,
cust_detl.cust_ref_id,
cust_detl.cust_name,
cust_detl.cust_address,
cust_detl.creation_timestamp,
MIN(creation_timestamp) over(PARTITION BY cust_id) AS min_timestamp
FROM cust_details cust_detl)
WHERE creation_timestamp = min_timestamp;