Oracle按时查询数据库而不向结果显示

Oracle按时查询数据库而不向结果显示,oracle,Oracle,我使用的是oracle11g 我想根据时间ASC对数据进行排序,但我不希望时间显示在结果上 质疑 如果我删除Y.TIME,它会显示错误 ORA-01791: not a SELECTed expression 有没有办法在不显示结果的情况下保持按Y.TIME排序 让我们看看按时间排序的问题,而不选择它是因为您正在执行选择不同的查询。在结果集中,对于D.DESCRIPTIONID、D.DESCRIPTION、D.PROFILEID\u FK和Y.PROFILEID\u FK的每个组合,只有一条记

我使用的是
oracle11g

我想根据
时间ASC
对数据进行排序,但我不希望
时间
显示在结果上

质疑

如果我删除
Y.TIME
,它会显示错误

ORA-01791: not a SELECTed expression
有没有办法在不显示结果的情况下保持按
Y.TIME
排序


让我们看看按
时间排序的问题,而不选择它是因为您正在执行
选择不同的
查询。在结果集中,对于
D.DESCRIPTIONID
D.DESCRIPTION
D.PROFILEID\u FK
Y.PROFILEID\u FK
的每个组合,只有一条记录。如果您按时间排序而不选择时间,现在的问题是,在对生成结果集中每个记录的每个潜在记录组进行排序时,您希望使用哪个时间值?这一点尚不清楚,因此Oracle不会继续进行此类查询

下面是一个可以使用的替代查询:

SELECT
    D.DESCRIPTIONID, 
    D.DESCRIPTION,
    D.PROFILEID_FK AS PROFILEID_FKS,
    Y.PROFILEID_FK AS PROFILEID_FKS2
FROM WA_BT_TBL_DESCRIPTION D
LEFT OUTER JOIN WA_BT_TBL_DAY Y
    ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK
WHERE
    D.PROFILEID_FK = 'PF0002' AND
    D.ACTIVE = 'Y'
GROUP BY
    D.DESCRIPTIONID, 
    D.DESCRIPTION,
    D.PROFILEID_FK,
    Y.PROFILEID_FK
ORDER BY
    MAX(Y.TIME);
在这里,我将distinct查询重写为一个分组查询,它在逻辑上与您最初的查询相同。但现在我按时间的总和排序,在这里是最大值。现在,在按时间订购时,您的意思没有歧义


请注意,许多RDBMS将使用group by在后台实现一个不同的查询。

最简单的方法是在子查询中隐藏Y.TIME,然后不要在外部查询中提取该字段:

SELECT DESCRIPTIONID, 
       DESCRIPTION,
       PROFILEID_FKS,
       PROFILEID_FKS2
  FROM (SELECT DISTINCT D.DESCRIPTIONID, 
                        D.DESCRIPTION,
                        D.PROFILEID_FK AS PROFILEID_FKS,
                        Y.PROFILEID_FK AS PROFILEID_FKS2,
                        Y.TIME
          FROM WA_BT_TBL_DESCRIPTION D
          LEFT OUTER JOIN WA_BT_TBL_DAY Y
            ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK
          WHERE D.PROFILEID_FK = 'PF0002' AND
                D.ACTIVE = 'Y'
          ORDER BY Y.TIME ASC)
如果您想更有趣,可以将子查询放入公共表表达式中:

WITH cteDESC AS (SELECT DISTINCT D.DESCRIPTIONID, 
                                 D.DESCRIPTION,
                                 D.PROFILEID_FK AS PROFILEID_FKS,
                                 Y.PROFILEID_FK AS PROFILEID_FKS2,
                                 Y.TIME
                   FROM WA_BT_TBL_DESCRIPTION D
                   LEFT OUTER JOIN WA_BT_TBL_DAY Y
                     ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK
                   WHERE D.PROFILEID_FK = 'PF0002' AND
                         D.ACTIVE = 'Y'
                   ORDER BY Y.TIME ASC)
SELECT DESCRIPTIONID, 
       DESCRIPTION,
       PROFILEID_FKS,
       PROFILEID_FKS2
  FROM cteDESC;

祝您好运。

我尝试了您的代码,并删除了Y.PROFILEID_FK后面的逗号,但仍然出现错误:ORA-01791:未选中expression@HiDayurieDave抱歉…我打错了,还在做
selectdistinct
。查询现在应该可以工作了。但是,如果不使用
GROUP BY
,如何保证外部查询的顺序?嗨,鲍勃,尝试了您的代码,但按时间排序不正确。请将ORDER BY子句移动到外部查询(ORDER BY time)。
WITH cteDESC AS (SELECT DISTINCT D.DESCRIPTIONID, 
                                 D.DESCRIPTION,
                                 D.PROFILEID_FK AS PROFILEID_FKS,
                                 Y.PROFILEID_FK AS PROFILEID_FKS2,
                                 Y.TIME
                   FROM WA_BT_TBL_DESCRIPTION D
                   LEFT OUTER JOIN WA_BT_TBL_DAY Y
                     ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK
                   WHERE D.PROFILEID_FK = 'PF0002' AND
                         D.ACTIVE = 'Y'
                   ORDER BY Y.TIME ASC)
SELECT DESCRIPTIONID, 
       DESCRIPTION,
       PROFILEID_FKS,
       PROFILEID_FKS2
  FROM cteDESC;