【问题标题】:ORA-01791: not a SELECTed expression PL SQLORA-01791: 不是 SELECTed 表达式 PL SQL
【发布时间】:2016-01-24 13:40:33
【问题描述】:

我有下一个查询 - o_ski_packages 是一个对象

SELECT DISTINCT p.resortsn
BULK   COLLECT INTO v_resortsn_tbl
FROM   TABLE (o_ski_packages) p;
ORDER BY p.resort_country_name ASC;

我想要的结果是这样的-

resortsn  resort_country_name  
1              AD
2              BU

我需要不同的,因为我可以拥有相同数量的记录 -

1              AD,
1              AD

谢谢。

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

从我的假设来看,这应该可以根据您的要求正常工作,假设您在上面提供的查询本身可以正常工作。

SELECT DISTINCT p.resortsn, max(resort_country_name) cn
BULK   COLLECT INTO v_resortsn_tbl
FROM   TABLE (O_SKI_PACKAGES) P
group by  p.resortsn
ORDER BY cn ASC;

尽管resort_country_name 与您的distinct 度假村相同,但数据库永远不会知道这一点。因此,将resort_country_name 放入任何不需要分组的聚合函数中,例如MAX。您还需要按resortsn 分组,如果您只选择resortsn,这可能没有必要,但由于您使用多个不同的聚合函数,您需要至少按1 分组。因此group by resortsn

【讨论】:

  • 你不需要distinct group by。但这可能行不通,因为您现在要选择两列。这取决于v_resortsn_tbl 的定义是否bulk collect into 可以使用它
  • 同意这一点。但是没有样本数据,我只是堆积在 OP 的现有查询上,我认为由于某种原因正在使用 distinct。无论如何,这适用于任何 resortsnresort_country_name 组合。感谢您指出。
【解决方案2】:

当您使用distinct 时,order by 需要引用select 中的表达式。否则,Oracle 怎么知道选择哪些值?

一个简单的方法是使用group by而不是distinct

SELECT p.resortsn
BULK COLLECT INTO v_resortsn_tbl
FROM TABLE (o_ski_packages) p
GROUP BY p.resortsn
ORDER BY MAX(p.resort_country_name) ASC;

这解决了原始查询的问题,但它只返回一列。看起来你想要这样的东西:

SELECT p.resortsn, MAX(p.resort_country_name) as resort_country_name
BULK COLLECT INTO v_resortsn_tbl
FROM TABLE (o_ski_packages) p
GROUP BY p.resortsn
ORDER BY MAX(p.resort_country_name) ASC;

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多