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;