2017-10-11 67 views
0

我使用的是Oracle 11gOracle上的查詢數據庫沒有顯示它的結果

我想根據TIME ASC對數據進行排序,但我不希望TIME顯示結果。

查詢

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 

如果我刪除Y.TIME,它告訴我錯誤

ORA-01791: not a SELECTed expression 

有什麼辦法如何通過Y.TIME排序保持不Y.TIME秀上的結果?

讓通過TIMESQL Fiddle

回答

1

看到排序的問題,而不是選擇它是因爲你正在做一個SELECT DISTINCT查詢。在結果集中,每個組合D.DESCRIPTIONID,D.DESCRIPTION,D.PROFILEID_FKY.PROFILEID_FK只會有一條記錄。如果你在沒有選擇它的時間ORDER BY,現在的問題是哪個你想在訂購每個潛在的組的的記錄中使用哪個時間值來生成結果集中的每條記錄?這並不明確,所以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); 

在這裏,我已經重寫了不同的查詢作爲一組通過查詢,這在邏輯上是相同的,你原來有什麼。但現在我ORDER BY聚合的時間,在這種情況下,最大值。現在,按照時間排序時,您的意思是沒有歧義的。

請注意,許多RDBMS將在使用group by的情況下實現獨特的查詢。

+0

我試過了你的代碼,並刪除了Y.PROFILEID_FK後的逗號,但仍然出現錯誤:ORA-01791:不是一個SELECTed表達式 –

+0

@HiDayurieDave道歉...我有一個錯字,並且還在執行'SELECT DISTINCT'。該查詢現在應該可以工作。 –

+0

酷,工作完美。乾杯 –

0

做最簡單的事情就是埋葬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; 

祝你好運。

+0

但是,如何保證外部查詢的排序而不使用「GROUP BY」? –

+0

嗨鮑勃,試過你的代碼,但按時間排序是不正確的。 –

+0

將ORDER BY子句移至外部查詢(ORDER BY TIME)。 – mathguy